一文搞懂:自定義註解

隨着註解使用的愈來愈普遍,在逐步體會到註解帶來的便利同時,人們又會提出新的需求,如何才能根據本身的需求定製註解。數組

自定義註解的使用。咱們用@interface 定義一個註解,而後定義其屬性,而後註解能夠被標註到屬性、方法、類以及註解上,咱們再使用註解時,使用目標對象的getDeclaredAnnotataion方法獲取註解實例對象。ide

如何定義註解。定義註解須要使用@interface。如:測試

public @interface Test{} 自定義的註解須要添加元註解或者默認配置。code

元註解解讀。@Target用到哪裏,@Retention何時用,@Inherited是否容許繼承。對象

@Target 表示註解用於什麼地方。具體參數類型以下:
ElementType.CONSTRUCTOR,用於構造器
ElementType.FIELD,用於成員變量、屬性
ElementType.LOCAL,用於描述局部變量
ElementType.METHOD,用於描述方法
ElementType.PACKAGE,用於描述包
ElementType.PARAMETER,用於描述參數
ElementType.TYPE,用於描述類、接口
@Retention 表示何時使用該註解。具體參數以下:
RetentionPolicy.SOURCE,表示在編譯階段丟棄,編譯結束後,無心義。如:@Override。
RetentionPolicy.CLASS,表示在類加載時丟去,在字節碼加載時有用,默認使用這種方式。
RetentionPolicy.RUNTIME,表示始終不會丟棄,在運行時,使用反射機制讀取到該註解的信息。自定義註解多爲這種方式。
@Inherited 表示可否被繼承,若使用,則表示能夠被繼承。

下邊進行實例操繼承

1、 首先自定義一個註解。如:接口

@Target(value = ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Teacher {
public String name() default "";
public String school() default "";
public String students() default "";
}

2、使用反射告訴這個註解要作什麼get

public class AnnotationUtil {
public static void getTeacherInfo(Class clazz){
String teacherInfo = "老師信息:";
//獲取類中全部變量field
Field[] fields = clazz.getDeclaredFields();
//遍歷field數組
for (Field field: fields) {
if (field.isAnnotationPresent(Teacher.class)) {
//找到有@Teacher的註解
Teacher teacher = field.getAnnotation(Teacher.class);
teacherInfo = teacherInfo+teacher.name()+","+teacher.school()+","+teacher.students();
System.out.println(teacherInfo);
}
}
}
}

3、 在其它地方使用該註解it

public class SmallStudent {

@Teacher(name = "黃老師", school = "杭州一中", students = "高三五班")
public String teacher;
}

4、測試io

@Test
public void testAnnotation(){
AnnotationUtil.getTeacherInfo(SmallStudent.class);
}

5、測試結果

老師信息:黃老師,杭州一中,高三五班

最後,自定義註解你理解了嗎,歡迎討論和關注。

相關文章
相關標籤/搜索