註解的概念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 }
參考文章: