標籤:ack and copyto 聲明 調用 擷取 war 生命週期 type
註解的概念
註解(Annotation),也叫中繼資料(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就能夠調用Annotations。註解與類、介面、枚舉在同一個層次,並可以應用於包、類型、構造方法、方法、成員變數、參數、本地變數的聲明中,用來對這些元素進行說明注釋。
註解的文法與定義形式
(1)以@interface關鍵字定義
(2)註解包含成員,成員以無參數的方法的形式被聲明。其方法名和傳回值定義了該成員的名字和類型。
(3)成員賦值是通過@Annotation(name=value)的形式。
(4)註解需要標明註解的生命週期,註解的修飾目標等資訊,這些資訊是通過元註解實現。
以 Java.lang.annotation 中定義的 Target 註解來說明:
[java] view plain copy
- @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,在賦值過程中可以簡寫。如果成員類型為數組,但是只賦值一個元素,則也可以簡寫。如上面的簡寫形式為:
[java] view plain copy
- @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,包括以下幾種情況:
[java] view plain copy
- public enum RetentionPolicy {
- /**
- * 註解只保留在源檔案,當Java檔案編譯成class檔案的時候,註解被遺棄.
- * 這意味著:Annotation僅存在於編譯器處理期間,編譯器處理完之後,該Annotation就沒用了
- */
- SOURCE,
-
- /**
- * 註解被保留到class檔案,但jvm載入class檔案時候被遺棄,這是預設的生命週期.
- */
- CLASS,
-
- /**
- * 註解不僅被儲存到class檔案中,jvm載入class檔案之後,仍然存在,
- * 儲存到class對象中,可以通過反射來擷取
- */
- RUNTIME
- }
元註解
如上所介紹的Java定義了4個標準的元註解:
@Documented:標記註解,用於描述其它類型的註解應該被作為被標註的程式成員的公用API,因此可以被例如javadoc此類的工具文檔化。
[java] view plain copy
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Documented {
- }
@Inherited:標記註解,允許子類繼承父類的註解
[java] view plain copy
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Inherited {
- }
@Retention:指Annotation被保留的時間長短,標明註解的生命週期,3種RetentionPolicy取值含義上面以說明
[java] view plain copy
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Retention {
- RetentionPolicy value();
- }
@Target:標明註解的修飾目標,共有
[java] view plain copy
- @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
- }
Java註解基礎概念總結