1. 程式人生 > >Java註解基礎概念總結

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
}

參考文章:

反射、註解與依賴注入總結

註解系列知識總結(一)