注解(Annontion)是Java5開始引入的新特征。它提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。
1、元注解
元注解的作用就是負責注解其他注解。Java5.0定義了4個標准的meta-annotation類型,它們被用來提供對其它 annotation類型作說明。Java5.0定義的元注解有以下幾種:
- @Target
- @Retention
- @Documented
- @Inherited
1.1 @Target
用於描述注解的范圍,即注解在哪用。它說明了Annotation所修飾的對象范圍:Annotation可被用於 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)等。取值類型(ElementType)有以下幾種:
- CONSTRUCTOR:用於描述構造器
- FIELD:用於描述域即類成員變量
- LOCAL_VARIABLE:用於描述局部變量
- METHOD:用於描述方法
- PACKAGE:用於描述包
- PARAMETER:用於描述參數
- TYPE:用於描述類、接口(包括注解類型) 或enum聲明
- TYPE_PARAMETER:1.8版本開始,描述類、接口或enum參數的聲明
- TYPE_USE:1.8版本開始,描述一種類、接口或enum的使用聲明
示例:
@Target({ElementType.METHOD, ElementType.TYPE}) public @interface Log { ...... }
上述表示Log注解可以用在類、接口、enum和方法上
1.2 @Retention
用於描述注解的生命周期,表示需要在什么級別保存該注解,即保留的時間長短。取值類型(RetentionPolicy)有以下幾種:
- SOURCE:在源文件中有效(即源文件保留)
- CLASS:在class文件中有效(即class保留)
- RUNTIME:在運行時有效(即運行時保留)
示例:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Log { ...... }
上述示例使用RetentionPolicy.RUNTIME,這樣注解處理器可以通過反射,獲取到該注解的屬性值,從而去做一些運行時的邏輯處理。
1.3 @Documented
用於描述其它類型的annotation應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化。它是一個標記注解,沒有成員。
示例:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { ...... }
1.4 @Inherited
用於表示某個被標注的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。