java API提供四個元注解分別是:@Target,@Retention,@Documented,@Inherited。是專門用來定義注解的注解。其作用分別是:
@Target 表示該注解用于什么地方,可能的值在枚舉類 ElemenetType 中,包括:
ElemenetType.CONSTRUCTOR----------------------------構(gòu)造器聲明
ElemenetType.FIELD --------------------------------------域聲明(包括 enum 實例)
ElemenetType.LOCAL_VARIABLE------------------------- 局部變量聲明
ElemenetType.METHOD ----------------------------------方法聲明
ElemenetType.PACKAGE --------------------------------- 包聲明
ElemenetType.PARAMETER ------------------------------參數(shù)聲明
ElemenetType.TYPE--------------------------------------- 類,接口(包括注解類型)或enum聲明
@Retention 表示在什么級別保存該注解信息??蛇x的參數(shù)值在枚舉類型 RetentionPolicy 中,包括:
RetentionPolicy.SOURCE ---------------------------------注解將被編譯器丟棄
RetentionPolicy.CLASS -----------------------------------注解在class文件中可用,但會被VM丟棄
RetentionPolicy.RUNTIME VM-------將在運行期也保留注釋,因此可以通過反射機制讀取注解的信息。
@Documented 將此注解包含在 javadoc 中 ,它代表著此注解會被javadoc工具提取成文檔。在doc文檔中的內(nèi)容會因為此注解的信息內(nèi)容不同而不同。相當與@see,@param 等。
@Inherited 允許子類繼承父類中的注解。
1.首先來看RUNTIME級別的注解的例子。
定義一個注解:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
@Documented
public @interface AddData {
String EventType() default "";
}
定義了一個運行期的注解,它的作用范圍是 變量(FIELD) 和 方法(METHOD)
寫一個方法,在運行時解析注解
public static void searchAllData(Object o){
if(o == null){
return;
}
final Class<?> clazz = o.getClass(); //類
if(clazz.isAnnotationPresent(AddData.class)){
AddData testAnno = clazz.getAnnotation(AddData.class);
Logger.doEvent("TEST_ANNO_C",testAnno.EventType());
}
Field[] fields = clazz.getDeclaredFields();//成員變量類
for (Field field : fields) {
if (field.isAnnotationPresent(AddData.class)) {
AddData testAnno = field.getAnnotation(AddData.class);
Logger.doEvent("TEST_ANNO_F",testAnno.EventType());
}
}
Method[] methods = clazz.getDeclaredMethods();//方法
for(Method method:methods){
if(method.isAnnotationPresent(AddData.class)){
AddData testAnno = method.getAnnotation(AddData.class);
Logger.doEvent("TEST_ANNO_M",testAnno.EventType());
}
}
}
使用:
注解成員變量:
@AddData(EventType = "3232")
private boolean isGood;
注解方法:
@AddData(EventType = "1213")
public void checkUpdate(){
}
解析:
Engine.searchAllData(this);