第一節(jié):注解的作用
Annotation(注解)是JDK5.0及以后版本引入的。它的作用是修飾編程元素。什么是編程元素呢?例如:包、類、構(gòu)造方法、方法、成員變量等。
第二節(jié):注解的作者
注解是JDK 5.0推出來的,這部分JDK源碼的作者是:Joshua Bloch,這是一個技術(shù)大牛。Collections Framework皆是他一手打造,還獲得了當(dāng)年的Jolt大獎。另外,他還寫了一本非常出名的書:《Effective Java》,相信大家不會陌生吧。如果沒有讀過這本書,趕緊讀一讀吧。關(guān)于更多Joshua Bloch的故事,后期【Java人生】將會單獨(dú)撰文介紹,這里不再贅述了。
第三節(jié):注解的語法與定義形式
(1)以@interface關(guān)鍵字定義
(2)注解包含成員,成員以無參數(shù)的方法的形式被聲明。其方法名和返回值定義了該成員的名字和類型。
(3)成員賦值是通過@Annotation(name=value)的形式。
(4)注解需要標(biāo)明注解的生命周期,注解的修飾目標(biāo)等信息,這些信息是通過元注解實現(xiàn)。
上面的語法不容易理解,下面通過例子來說明一下,這個例子就是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)
第四節(jié):注解的分類
注解分為兩類,一類是元注解,另外一類是普通注解。所謂元注解就是修飾注解的注解。拿到一個注解,如何知道它是否是元注解呢?需要看它的元注解(無論是元注解還是普通注解都是有元注解的),如果看到這樣的元注解:@Target(ElementType.ANNOTATION_TYPE),那么此時這個注解一定是元注解。
第五節(jié):注解的生命周期
注解的定義語法中已經(jīng)說到了:注解需要標(biāo)明注解的生命周期,這些信息是通過元注解實現(xiàn)。而這個元注解是:
public @interface Retention
{
RetentionPolicy value;
}
Retention注解的值是enum類型的RetentionPolicy。包括如下幾種情況:
(1)SOURCE:注解只保留在源文件,當(dāng)Java文件編譯成class文件的時候,注解被遺棄。
(2)CLASS:注解被保留到class文件,jvm加載class文件時候被遺棄。這是默認(rèn)的生命周期。
(3)RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在,保存到class對象中,可以通過反射來獲取。
第六節(jié):注解的修飾目標(biāo)
注解的定義語法中已經(jīng)說到了:注解需要標(biāo)明注解的修飾目標(biāo),這些信息是通過元注解實現(xiàn)。而這個元注解是:
public @interface Target
{
ElementType value;
}
這個注解的值是enum類型ElementType。包括以下幾種情況:
(1)TYPE:指的是在類,接口(包括注解)或者enum上使用的注解。
(2)FIELD:指的在field屬性,也包括enum常量使用的注解。
(3)METHOD:指的是在方法聲明上使用的注解。
(4)PARAMETER:指的是在參數(shù)上使用的注解,
(5)CONSTRUCTOR:指的是在構(gòu)造器使用的注解。
(6)LOCAL_VARIABLE:指的是在局部變量上使用的注解。
(7)ANNOTATION_TYPE:指的是在注解上使用的元注解
(8)PACKAGE:指的是在包上使用的注解。
第七節(jié):注解的底層實現(xiàn)
定義一個注解:
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface Cache{String value default "cache";}
分析其字節(jié)碼,如下圖所示:分析上面的字節(jié)碼,我們可以得出:
第一:public interface Cache extends java.lang.annotation.Annotation,說明Cache注解是繼承自Annotation,仍然是interface。
第二:publicabstractjava.lang.String value,說明value方法是abstract類型。。