更新時(shí)間:2020-07-28 16:49:33 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2638次
一.注解的本質(zhì)
「java.lang.annotation.Annotation」接口中有這么一句話,用來描述『注解』。
The common interface extended by all annotation types
所有的注解類型都繼承自這個(gè)普通的接口(Annotation)
這句話有點(diǎn)抽象,但卻說出了注解的本質(zhì)。我們看一個(gè)JDK內(nèi)置注解的定義:
?Target(ElementType.METHOD)
?Retention(RetentionPolicy.SOURCE)
public interface Override{
}
這是注解 Override的定義,其實(shí)它本質(zhì)上就是:
public interface Override extends Annotation{
}
沒錯(cuò),注解的本質(zhì)就是一個(gè)繼承了Annotation接口的接口。有關(guān)這一點(diǎn),你可以去反編譯任意一個(gè)注解類,你會(huì)得到結(jié)果的。
一個(gè)注解準(zhǔn)確意義上來說,只不過是一種特殊的注釋而已,如果沒有解析它的代碼,它可能連注釋都不如。
解析一個(gè)類或者方法的注解往往有兩種形式,一種是編譯期直接的掃描,一種是運(yùn)行期反射。
二.元注解
『元注解』是用于修飾注解的注解,通常用在注解的定義上。
JAVA中有以下幾個(gè)『元注解』:
Target:注解的作用目標(biāo)
Retention:注解的生命周期
Documented:注解是否應(yīng)當(dāng)被包含在JavaDoc文檔中
Inherited:是否允許子類繼承該注解
1. Target
Target注解指明該注解可以作用哪些對象上。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public?@interface?Target?{
????/**
????????*?Returns?an?array?of?the?kinds?of?elements?an?annotation?type
????????*?can?be?applied?to.
????????*?@return?an?array?of?the?kinds?of?elements?an?annotation?type
????????*?can?be?applied?to
????????*/
????ElementType[]?value();
}
注解接收一個(gè)ElementType數(shù)組,ElementType是一個(gè)枚舉,成員如下:
ElementType.TYPE:允許被修飾的注解作用在類、接口和枚舉上
ElementType.FIELD:允許作用在屬性字段上
ElementType.METHOD:允許作用在方法上
ElementType.PARAMETER:允許作用在方法參數(shù)上
ElementType.CONSTRUCTOR:允許作用在構(gòu)造器上
ElementType.LOCAL_VARIABLE:允許作用在本地局部變量上
ElementType.ANNOTATION_TYPE:允許作用在注解上
ElementType.PACKAGE:允許作用在包上
ElementType.TYPE_PARAMETER:允許作用在類型參數(shù)上
ElementType.TYPE_USE:允許作用在類型上
2. Retention
Retention用于指明當(dāng)前注解的生命周期
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public?@interface?Retention?{
????/**
????????*?Returns?the?retention?policy.
????????*?@return?the?retention?policy
????????*/
????RetentionPolicy?value();
}
注解接收一個(gè)RetentionPolicy數(shù)據(jù),RetentionPolicy是個(gè)枚舉,成員如下:
RetentionPolicy.SOURCE:當(dāng)前注解編譯期可見,不會(huì)寫入class文件
RetentionPolicy.CLASS:類加載階段丟棄,會(huì)寫入class文件
RetentionPolicy.RUNTIME:永久保存,可以反射獲取
三.Java的內(nèi)置三大注解
Override
Deprecated標(biāo)識(shí)類或方法不再推薦使用
SuppressWarnings主要用來壓制java的警告
四.實(shí)現(xiàn)一個(gè)自己的注解
定義一個(gè)注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public?@interface?HelloAnnotation?{
????String?value()?default?"Hello?annotation!";
}
使用這個(gè)注解:
public?class?UseAnnotation?{
????@HelloAnnotation
????public?void?hello()?{
????????System.out.println("hello");
????}
????@HelloAnnotation("Hello?world!")
????public?void?helloWorld()?{
????????System.out.println("Hello?world!");
????}
}
注解最重要的部分在于對注解的處理。注解處理器就是通過反射機(jī)制獲取被檢查方法上的注解信息,然后根據(jù)注解元素的值進(jìn)行特定的處理。如果沒有注解處理器,注解就是個(gè)注釋,或者連注釋都不如。
處理這個(gè)注解:
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????testAnnotation(UseAnnotation.class);
????}
????private?static?void?testAnnotation(Class?cl)?{
????????for?(Method?m?:?cl.getDeclaredMethods())?{
????????????HelloAnnotation?ha?=?m.getAnnotation(HelloAnnotation.class);
????????????if?(ha?!=?null)?{
????????????????System.out.println("Found?My?Annotation:?"?+?ha.value());
????????????}
????????}
????}
}
輸出結(jié)果:
Found?My?Annotation:?Hello?annotation!
Found?My?Annotation:?Hello?world!
什么是Java注解:http://www.dabaquan.cn/tutorial_java_advance/1055.html
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“技術(shù)分析之Java注解之基本原理介紹”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀