Java註解基礎概念總結

註解的概念java

註解(Annotation),也叫元數據(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就可以調用Annotations。註解與類、接口、枚舉在同一個層次,並能夠應用於包、類型、構造方法、方法、成員變量、參數、本地變量的聲明中,用來對這些元素進行說明註釋。swift


註解的語法與定義形式數組

(1)以@interface關鍵字定義
(2)註解包含成員,成員以無參數的方法的形式被聲明。其方法名和返回值定義了該成員的名字和類型。
(3)成員賦值是經過@Annotation(name=value)的形式。
(4)註解須要標明註解的生命週期,註解的修飾目標等信息,這些信息是經過元註解實現。jvm

以 java.lang.annotation 中定義的 Target 註解來講明:ide

 

@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();
}

註解的分類工具

註解的分類有兩種分法:源碼分析

第一種分法spa

一、基本內置註解,是指Java自帶的幾個Annotation,如@Override、Deprecated、@SuppressWarnings等;.net

二、元註解(meta-annotation),是指負責註解其餘註解的註解,JDK 1.5及之後版本定義了4個標準的元註解類型,以下:

@Target
@Retention
@Documented
@Inherited
三、自定義註解,根據須要能夠自定義註解,自定義註解須要用到上面的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
}

參考文章:

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

註解系列知識總結(一)

相關文章
相關標籤/搜索