http://blog.csdn.net/github_35180164/article/details/52107204
注解的概念
注解(Annotation)特石,也叫元數(shù)據(jù)(Metadata),是Java5的新特性鳖链,JDK5引入了Metadata很容易的就能夠調用Annotations姆蘸。注解與類、接口、枚舉在同一個層次逞敷,并可以應用于包狂秦、類型、構造方法推捐、方法裂问、成員變量、參數(shù)牛柒、本地變量的聲明中堪簿,用來對這些元素進行說明注釋。
注解的語法與定義形式
(1)以@interface關鍵字定義(2)注解包含成員皮壁,成員以無參數(shù)的方法的形式被聲明戴甩。其方法名和返回值定義了該成員的名字和類型。(3)成員賦值是通過@Annotation(name=value)的形式闪彼。(4)注解需要標明注解的生命周期甜孤,注解的修飾目標等信息,這些信息是通過元注解實現(xiàn)畏腕。
以 Java.lang.annotation 中定義的 **Target **注解來說明:
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.ANNOTATION_TYPE } )
public @interface Target {
ElementType[] value();
}
源碼分析如下:第一:元注解@Retention缴川,成員value的值為RetentionPolicy.RUNTIME。第二:元注解@Target描馅,成員value是個數(shù)組把夸,用{}形式賦值,值為ElementType.ANNOTATION_TYPE第三:成員名稱為value铭污,類型為ElementType[]另外恋日,需要注意一下,如果成員名稱是value嘹狞,在賦值過程中可以簡寫岂膳。如果成員類型為數(shù)組,但是只賦值一個元素磅网,則也可以簡寫谈截。如上面的簡寫形式為:
@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、自定義注解竿奏,根據(jù)需要可以自定義注解袄简,自定義注解需要用到上面的meta-annotation
第二種分法
注解需要標明注解的生命周期,這些信息是通過元注解 @Retention 實現(xiàn)泛啸,注解的值是 **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,
/** 參數(shù) */
PARAMETER,
/** 構造函數(shù) */
CONSTRUCTOR,
/** 局部變量 */
LOCAL_VARIABLE,
/** 注解上使用的元注解 */
ANNOTATION_TYPE,
/** 包 */
PACKAGE
}