http://blog.csdn.net/github_35180164/article/details/52107204
注解的概念
注解(Annotation),也叫元數(shù)據(jù)(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就能夠調(diào)用Annotations。注解與類(lèi)、接口、枚舉在同一個(gè)層次,并可以應(yīng)用于包、類(lèi)型、構(gòu)造方法、方法、成員變量、參數(shù)、本地變量的聲明中,用來(lái)對(duì)這些元素進(jìn)行說(shuō)明注釋。
注解的語(yǔ)法與定義形式
(1)以@interface關(guān)鍵字定義(2)注解包含成員,成員以無(wú)參數(shù)的方法的形式被聲明。其方法名和返回值定義了該成員的名字和類(lèi)型。(3)成員賦值是通過(guò)@Annotation(name=value)的形式。(4)注解需要標(biāo)明注解的生命周期,注解的修飾目標(biāo)等信息,這些信息是通過(guò)元注解實(shí)現(xiàn)。
以 Java.lang.annotation 中定義的 **Target **注解來(lái)說(shuō)明:
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.ANNOTATION_TYPE } )
public @interface Target {
ElementType[] value();
}
源碼分析如下:第一:元注解@Retention,成員value的值為RetentionPolicy.RUNTIME。第二:元注解@Target,成員value是個(gè)數(shù)組,用{}形式賦值,值為ElementType.ANNOTATION_TYPE第三:成員名稱(chēng)為value,類(lèi)型為ElementType[]另外,需要注意一下,如果成員名稱(chēng)是value,在賦值過(guò)程中可以簡(jiǎn)寫(xiě)。如果成員類(lèi)型為數(shù)組,但是只賦值一個(gè)元素,則也可以簡(jiǎn)寫(xiě)。如上面的簡(jiǎn)寫(xiě)形式為:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
注解的分類(lèi)
注解的分類(lèi)有兩種分法:
第一種分法
1、基本內(nèi)置注解,是指Java自帶的幾個(gè)Annotation,如@Override、Deprecated、@SuppressWarnings等;
2、元注解(meta-annotation),是指負(fù)責(zé)注解其他注解的注解,JDK 1.5及以后版本定義了4個(gè)標(biāo)準(zhǔn)的元注解類(lèi)型,如下:
@Target
@Retention
@Documented
@Inherited
3、自定義注解,根據(jù)需要可以自定義注解,自定義注解需要用到上面的meta-annotation
第二種分法
注解需要標(biāo)明注解的生命周期,這些信息是通過(guò)元注解 @Retention 實(shí)現(xiàn),注解的值是 **enum **類(lèi)型的 RetentionPolicy,包括以下幾種情況:
public enum RetentionPolicy {
/**
* 注解只保留在源文件,當(dāng)Java文件編譯成class文件的時(shí)候,注解被遺棄.
* 這意味著:Annotation僅存在于編譯器處理期間,編譯器處理完之后,該Annotation就沒(méi)用了
*/
SOURCE,
/**
* 注解被保留到class文件,但jvm加載class文件時(shí)候被遺棄,這是默認(rèn)的生命周期.
*/
CLASS,
/**
* 注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在,
* 保存到class對(duì)象中,可以通過(guò)反射來(lái)獲取
*/
RUNTIME
}
元注解
如上所介紹的Java定義了4個(gè)標(biāo)準(zhǔn)的元注解:
@Documented:標(biāo)記注解,用于描述其它類(lèi)型的注解應(yīng)該被作為被標(biāo)注的程序成員的公共API,因此可以被例如javadoc此類(lèi)的工具文檔化。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Inherited:標(biāo)記注解,允許子類(lèi)繼承父類(lèi)的注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
@Retention:指Annotation被保留的時(shí)間長(zhǎng)短,標(biāo)明注解的生命周期,3種**RetentionPolicy**取值含義上面以說(shuō)明
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
@Target:標(biāo)明注解的修飾目標(biāo),共有
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
// ElementType取值
public enum ElementType {
/** 類(lèi)、接口(包括注解類(lèi)型)或枚舉 */
TYPE,
/** field屬性,也包括enum常量使用的注解 */
FIELD,
/** 方法 */
METHOD,
/** 參數(shù) */
PARAMETER,
/** 構(gòu)造函數(shù) */
CONSTRUCTOR,
/** 局部變量 */
LOCAL_VARIABLE,
/** 注解上使用的元注解 */
ANNOTATION_TYPE,
/** 包 */
PACKAGE
}