注解(Annotation):在JDK1.5之后增加的一個新特性
現實中,Hibernate、Spring等框架中都大量使用注解。注解作為程序的元數據嵌入到程序。注解可以被解析工具或編譯工具解析,此處注意注解不同于注釋(comment)。當一個接口直接繼承java.lang.annotation.Annotation接口時,仍是接口,而并非注解。要想自定義注解類型,只能通過@interface關鍵字的方式,其實通過該方式會隱含地繼承.Annotation接口。
基本的注解類型
Documented:表示含有該注解類型的元素(帶有注釋的)會通過javadoc或者類似的工具進行文檔話。該類型應用于注解那些影響客戶使用帶注釋的元素聲明的類型。如果類型聲明是用的Documented來注解,這種類型的注解被作為被標注的程序成員的公共API
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
Inherited:表示該注解類型被自動繼承,如果用戶在當前類中查詢這個元注解類型并且當前類的聲明中不包含這個元注解類型,那么也將自動查詢當前類的父類是否存在Inherited元注解,這個動作將被重復執行知道這個標注類型被找到,或者是查詢到頂層的父類。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
Retention:表示該注解類型的注解保留的時長。當注解類型聲明中沒有@Retention元注解,則默認保留策略為RetentionPolicy.CLASS。關于保留策略(RetentionPolicy)是枚舉類型,共定義3種保留策略
Source:僅保存在java源文件,經過編譯器后便丟棄相應的注解
Class:存在java源文件,以及經編譯器后生成的Class字節嗎文件,但在運行時VM不再保留注釋
Runtime:存在源文件、編譯生成的Class字節碼文件,以及保留在運行時VM中,可通過反射性地讀取注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
上面源碼@Retention的定義中有一行@Retention(RetentionPolicy.RUNTIME),意思是指當前注解的保留策略為RUNTIME,即存在Java源文件,也存在經過編譯器編譯后的生成的Class字節碼文件,同時在運行時虛擬機(VM)中也保留該注解,可通過反射機制獲取當前注解內容。
Target:表示該注解類型的所使用的程序元素類型。當注解類型聲明中沒有@Target元注解,則默認為可適用所有的程序元素。如果存在指定的@Target元注解,則編譯器強制實施相應的使用限制。關于程序元素(ElementType)是枚舉類型,共定義8種程序元素:ANNOTATION_TYPE——注解類型聲明,CONSTRUCTOR——構造方法聲明,LOCAL_VARIABLE—— 局部變量聲明,METHOD——方法聲明,PACKAGE——包聲明,PARAMETER——參數聲明,TYPE——類、接口(包括注解類型)或枚舉聲明
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}