注解的使用

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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容