Java註解基礎概念總結
註解的概念
註解(Annotation),也叫元資料(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就能夠呼叫Annotations。註解與類、介面、列舉在同一個層次,並可以應用於包、型別、構造方法、方法、成員變數、引數、本地變數的宣告中,用來對這些元素進行說明註釋。
註解的語法與定義形式
(1)以@interface關鍵字定義
(2)註解包含成員,成員以無引數的方法的形式被宣告。其方法名和返回值定義了該成員的名字和型別。
(3)成員賦值是通過@Annotation(name=value)的形式。
(4)註解需要標明註解的生命週期,註解的修飾目標等資訊,這些資訊是通過元註解實現。
以 java.lang.annotation 中定義的 Target 註解來說明:
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = { ElementType.ANNOTATION_TYPE } ) public @interface Target { ElementType[] value(); }
原始碼分析如下:
第一:元註解@Retention,成員value的值為RetentionPolicy.RUNTIME。
第二:元註解@Target,成員value是個陣列,用{}形式賦值,值為ElementType.ANNOTATION_TYPE
第三:成員名稱為value,型別為ElementType[]
另外,需要注意一下,如果成員名稱是value,在賦值過程中可以簡寫。如果成員型別為陣列,但是隻賦值一個元素,則也可以簡寫。如上面的簡寫形式為:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
註解的分類
註解的分類有兩種分法:
第一種分法
1、基本內建註解,是指Java自帶的幾個Annotation,如@Override、Deprecated、@SuppressWarnings等;
2、元註解(meta-annotation),是指負責註解其他註解的註解,JDK 1.5及以後版本定義了4個標準的元註解型別,如下:
@Target
@Retention
@Documented
@Inherited
3、自定義註解,根據需要可以自定義註解,自定義註解需要用到上面的meta-annotation
第二種分法
註解需要標明註解的生命週期,這些資訊是通過元註解 @Retention 實現,註解的值是 enum 型別的 RetentionPolicy,包括以下幾種情況:
public enum RetentionPolicy { /** * 註解只保留在原始檔,當Java檔案編譯成class檔案的時候,註解被遺棄. * 這意味著:Annotation僅存在於編譯器處理期間,編譯器處理完之後,該Annotation就沒用了 */ SOURCE, /** * 註解被保留到class檔案,但jvm載入class檔案時候被遺棄,這是預設的生命週期. */ CLASS, /** * 註解不僅被儲存到class檔案中,jvm載入class檔案之後,仍然存在, * 儲存到class物件中,可以通過反射來獲取 */ RUNTIME } ---------------------
元註解
如上所介紹的Java定義了4個標準的元註解:
@Documented:標記註解,用於描述其它型別的註解應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
@Inherited:標記註解,允許子類繼承父類的註解
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }
@Retention:指Annotation被保留的時間長短,標明註解的生命週期,3種RetentionPolicy取值含義上面以說明
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
@Target:標明註解的修飾目標,共有
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); } // ElementType取值 public enum ElementType { /** 類、介面(包括註解型別)或列舉 */ TYPE, /** field屬性,也包括enum常量使用的註解 */ FIELD, /** 方法 */ METHOD, /** 引數 */ PARAMETER, /** 建構函式 */ CONSTRUCTOR, /** 區域性變數 */ LOCAL_VARIABLE, /** 註解上使用的元註解 */ ANNOTATION_TYPE, /** 包 */ PACKAGE }
參考文章: