一、Annotation 示例
Override Annotation
1 @Override2 public void onCreate(Bundle savedInstanceState);
二、Annotation 概念及作用
1 概念
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.
能夠添加到 Java 源代碼的語法元數據。類、方法、變量、參數、包都可以被注解,可用來將信息元數據與程序元素進行關聯。Annotation 中文常譯為“注解”。
2 作用
a. 標記,用于告訴編譯器一些信息
b. 編譯時動態處理,如動態生成代碼
c. 運行時動態處理,如得到注解信息
三、Annotation 分類
1 標準 Annotation
包括 Override, Deprecated, SuppressWarnings,標準 Annotation 是指 Java 自帶的幾個 Annotation,上面三個分別表示重寫函數,不鼓勵使用(有更好方式、使用有風險或已不在維護),忽略某項 Warning
2 元 Annotation
@Retention, @Target, @Inherited, @Documented,元 Annotation 是指用來定義 Annotation 的 Annotation,在后面 Annotation 自定義部分會詳細介紹含義
3 自定義 Annotation
自定義 Annotation 表示自己根據需要定義的 Annotation,定義時需要用到上面的元 Annotation
這里只是一種分類而已,也可以根據作用域分為源碼時、編譯時、運行時 Annotation,后面在自定義 Annotation 時會具體介紹。
四、Annotation 自定義
1 調用
1 public classApp {2
3 @MethodInfo(4 author = “trinea.cn+android@gmail.com”,5 date = "2014/02/14",6 version = 2)7 publicString getAppName() {8 return "trinea";9 }10 }
這里是調用自定義 Annotation——MethodInfo 的示例,MethodInfo Annotation 作用為給方法添加相關信息,包括 author、date、version。
2 定義
1 @Documented2 @Retention(RetentionPolicy.RUNTIME)3 @Target(ElementType.METHOD)4 @Inherited5 public @interfaceMethodInfo {6
7 String author() default "trinea@gmail.com";8
9 String date();10
11 int version() default 1;12 }
這里是 MethodInfo 的實現部分
(1). 通過 @interface 定義,注解名即為自定義注解名
(2). 注解配置參數名為注解類的方法名,且:
a. 所有方法沒有方法體,沒有參數沒有修飾符,實際只允許 public & abstract 修飾符,默認為 public ,不允許拋異常
b. 方法返回值只能是基本類型,String, Class, annotation, enumeration 或者是他們的一維數組
c. 若只有一個默認屬性,可直接用 value() 函數。一個屬性都沒有表示該 Annotation 為 Mark Annotation
(3). 可以加 default 表示默認值
3 元 Annotation
@Documented 是否會保存到 Javadoc 文檔中
@Retention 保留時間,可選值 SOURCE(源碼時),CLASS(編譯時),RUNTIME(運行時),默認為 CLASS,值為 SOURCE 大都為 Mark Annotation,這類 Annotation 大都用來校驗,比如 Override, Deprecated, SuppressWarnings
@Target 可以用來修飾哪些程序元素,如 TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER 等,未標注則表示可修飾所有
@Inherited 是否可以被繼承,默認為 false
五、Annotation 解析
1 運行時 Annotation 解析
(1) 運行時 Annotation 指 @Retention 為 RUNTIME 的 Annotation,可手動調用下面常用 API 解析
method.getAnnotation(AnnotationName.class);
method.getAnnotations();
method.isAnnotationPresent(AnnotationName.class);
其他 @Target 如 Field,Class 方法類似
getAnnotation(AnnotationName.class) 表示得到該 Target 某個 Annotation 的信息,因為一個 Target 可以被多個 Annotation 修飾
getAnnotations() 則表示得到該 Target 所有 Annotation
isAnnotationPresent(AnnotationName.class) 表示該 Target 是否被某個 Annotation 修飾
(2) 解析示例如下
1 public static voidmain(String[] args) {2 try{3 Class cls = Class.forName("cn.trinea.java.test.annotation.App");4 for(Method method : cls.getMethods()) {5 MethodInfo methodInfo =method.getAnnotation(6 MethodInfo.class);7 if (methodInfo != null) {8 System.out.println("method name:" +method.getName());9 System.out.println("method author:" +methodInfo.author());10 System.out.println("method version:" +methodInfo.version());11 System.out.println("method date:" +methodInfo.date());12 }13 }14 } catch(ClassNotFoundException e) {15 e.printStackTrace();16 }17 }