Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android -- Annotation

Android -- Annotation

編輯:關於Android編程

Override Annotation   @Override public void onCreate(Bundle savedInstanceState){}; 概念   An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.   分類   標准 Annotation   Override, Deprecated, SuppressWarnings   元 Annotation   @Retention, @Target, @Inherited, @Documented   自定義 Annotation   自定義 Annotation 表示自己根據需要定義的 Annotation,定義時需要用到上面的元 Annotation。   自定義   調用  
   @DBTableY(name = "YYD__DB")
   public class DB {
       @DBColumnY(name = "column11xx")
       public String column1;
       @DBColumnY(name = "column22xx")
       public String column2;

 

   } 定義
   @Retention(RetentionPolicy.RUNTIME)
   @Target(ElementType.TYPE)
   public @interface DBTableY {
       String name() default "YUYIDONG11";
   }
   @Retention(RetentionPolicy.RUNTIME)
   @Target({ElementType.FIELD})
   public @interface DBColumnY {
       String name() default "YUYIDONG";
   }

 

通過 @interface 定義,注解名即為自定義注解名 注解配置參數名為注解類的方法名,且: a. 所有方法沒有方法體,沒有參數沒有修飾符,實際只允許 public & abstract 修飾符,默認為 public ,不允許拋異常   b. 方法返回值只能是基本類型,String, Class, annotation, enumeration 或者是他們的一維數組   c. 若只有一個默認屬性,可直接用 value() 函數。一個屬性都沒有表示該 Annotation 為 Mark Annotation   可以加 default 表示默認值 元 Annotation   @Documented 是否會保存到 Javadoc 文檔中   @Retention 保留時間,可選值 SOURCE(源碼時),CLASS(編譯時),RUNTIME(運行時),默認為 CLASS,SOURCE 大都為 Mark Annotation,這類 Annotation 大都用來校驗,比如 Override, SuppressWarnings   作用:表示需要在什麼級別保存該注釋信息,用於描述注解的生命周期(即:被描述的注解在什麼范圍內有效)   取值(RetentionPoicy)有:       1.SOURCE:在源文件中有效(即源文件保留)       2.CLASS:在class文件中有效(即class保留)       3.RUNTIME:在運行時有效(即運行時保留)   ​   @Target 可以用來修飾哪些程序元素,如 TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER 等,未標注則表示可修飾所有。   作用:用於描述注解的使用范圍(即:被描述的注解可以用在什麼地方)   取值(ElementType)有:       1.CONSTRUCTOR:用於描述構造器       2.FIELD:用於描述域       3.LOCAL_VARIABLE:用於描述局部變量       4.METHOD:用於描述方法       5.PACKAGE:用於描述包       6.PARAMETER:用於描述參數       7.TYPE:用於描述類、接口(包括注解類型) 或enum聲明   ​   @Inherited 是否可以被繼承,默認為 false   當 @Inherited annotation類型標注的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強了這種繼承性。如果我們使用java.lang.reflect去查詢一個   @Inherited annotation類型的annotation時,反射代碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation類型被發現,或者到達類繼承結構的頂層。   注解   使用 @interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節。在定義注解時,不能繼承其他的注解或接口。 @interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數的默認值。      public @interface 注解名 {定義體} 注解參數的可支持數據類型:       1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)       2.String類型       3.Class類型       4.enum類型       5.Annotation類型       6.以上所有類型的數組   解析   運行時 Annotation 解析   運行時 Annotation 指 @Retention 為 RUNTIME 的 Annotation  
      method.getAnnotation(AnnotationName.class);
      method.getAnnotations();
      method.isAnnotationPresent(AnnotationName.class);
getAnnotation(AnnotationName.class) 表示得到該 Target 某個 Annotation 的信息,因為一個 Target 可以被多個 Annotation 修飾
getAnnotations() 則表示得到該 Target 所有 Annotation
isAnnotationPresent(AnnotationName.class) 表示該 Target 是否被某個 Annotation 修飾

      Class clazz = DB.class;
              if (clazz.isAnnotationPresent(DBTableY.class)) {
                  DBTableY dbTableY = (DBTableY) clazz.getAnnotation(DBTableY.class);
                  Log.i("yyd", "dbTableY.name()--->" + dbTableY.name());
                  Field[] fields = clazz.getFields();
                  for (Field field : fields) {
                      DBColumnY dbColumnY = field.getAnnotation(DBColumnY.class);
                      Log.i("yyd", "dbColumnY.name()--->" + dbColumnY.name());
                      Log.i("yyd", "field.getName()--->" + field.getName());
                  }
              }

 

編譯時 Annotation 解析   編譯時 Annotation 指 @Retention 為 CLASS 的 Annotation,甴編譯器自動解析。需要做的   自定義類集成自 AbstractProcessor 重寫其中的 process 函數 編譯器在編譯時自動查找所有繼承自 AbstractProcessor 的類,然後調用他們的 process 方法去處理。     
    SupportedAnnotationTypes({ "com.yydcdut.test.annotation.DBColumnY" })
      public class DBColumnProcessor extends AbstractProcessor {
      
          @Override
          public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
              for (TypeElement te : annotations) {
                  for (Element element : env.getElementsAnnotatedWith(te)) {
                      DBColumnY dbColumnY = element.getAnnotation(DBColumnY.class);
                     Log.i("yyd",element.getEnclosingElement().toString());
                  }
              }
              return false;
          }
      }

 

SupportedAnnotationTypes 表示這個 Processor 要處理的 Annotation 名字。 process 函數中參數 annotations 表示待處理的 Annotations,參數 env 表示當前或是之前的運行環境。 process 函數返回值表示這組 annotations 是否被這個 Processor 接受,如果接受後續子的 rocessor 不會再對這個 Annotations 進行處理。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved