隨着註解使用的愈來愈普遍,在逐步體會到註解帶來的便利同時,人們又會提出新的需求,如何才能根據本身的需求定製註解。數組
自定義註解的使用。咱們用@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、測試結果
老師信息:黃老師,杭州一中,高三五班
最後,自定義註解你理解了嗎,歡迎討論和關注。