溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中如何設(shè)計(jì)自己的Annotation

發(fā)布時(shí)間:2022-01-05 15:57:52 來(lái)源:億速云 閱讀:111 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)Java中如何設(shè)計(jì)自己的Annotation的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

了解一下java1.5起默認(rèn)的三個(gè)annotation類型:

一個(gè)是@Override:只能用在方法之上的,用來(lái)告訴別人這一個(gè)方法是改寫父類的。

一個(gè)是@Deprecated:建議別人不要使用舊的API的時(shí)候用的,編譯的時(shí)候會(huì)用產(chǎn)生警告信息,可以設(shè)定在程序里的所有的元素上.

一個(gè)是@SuppressWarnings:這一個(gè)類型可以來(lái)暫時(shí)把一些警告信息消息關(guān)閉.

如果不清楚上面三個(gè)類型的具體用法,各位可以baidu或google一下的,很簡(jiǎn)單的。

第二部分:講一下annotation的概念,再來(lái)講一下怎樣設(shè)計(jì)自己的annotation.

首先在jdk自帶的java.lang.annotation包里,打開如下幾個(gè)源文件:

1、源文件Target.java

代碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
 ElementType[] value();

其中的@interface是一個(gè)關(guān)鍵字,在設(shè)計(jì)annotations的時(shí)候必須把一個(gè)類型定義為@interface,而不能用class或interface關(guān)鍵字(會(huì)不會(huì)覺(jué)得sun有點(diǎn)吝嗇,偏偏搞得與interface這么像).

2、源文件Retention.java

代碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
 RetentionPolicy value();

看到這里,大家可能都模糊了,都不知道在說(shuō)什么,別急,往下看一下.

在上面的文件都用到了RetentionPolicy,ElementType這兩個(gè)字段,你可能就會(huì)猜到這是兩個(gè)java文件.的確,這兩個(gè)文件的源代碼如下:

3、源文件RetentionPolicy.java

代碼

public enum RetentionPolicy {
 SOURCE,
 CLASS,
 RUNTIME

這是一個(gè)enum類型,共有三個(gè)值,分別是SOURCE,CLASS 和 RUNTIME.

SOURCE代表的是這個(gè)Annotation類型的信息只會(huì)保留在程序源碼里,源碼如果經(jīng)過(guò)了編譯之后,Annotation的數(shù)據(jù)就會(huì)消失,并不會(huì)保留在編譯好的.class文件里面。

ClASS的意思是這個(gè)Annotation類型的信息保留在程序源碼里,同時(shí)也會(huì)保留在編譯好的.class文件里面,在執(zhí)行的時(shí)候,并不會(huì)把這一些信息加載到虛擬機(jī)(JVM)中去.注意一下,當(dāng)你沒(méi)有設(shè)定一個(gè)Annotation類型的Retention值時(shí),系統(tǒng)默認(rèn)值是CLASS.

第三個(gè),是RUNTIME,表示在源碼、編譯好的.class文件中保留信息,在執(zhí)行的時(shí)候會(huì)把這一些信息加載到JVM中去的.
  舉一個(gè)例子,如@Override里面的Retention設(shè)為SOURCE,編譯成功了就不要這一些檢查的信息;相反,@Deprecated里面的Retention設(shè)為RUNTIME,表示除了在編譯時(shí)會(huì)警告我們使用了哪個(gè)被Deprecated的方法,在執(zhí)行的時(shí)候也可以查出該方法是否被Deprecated.

4、源文件ElementType.java

代碼

public enum ElementType {
 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,
 LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE

@Target里面的ElementType是用來(lái)指定Annotation類型可以用在哪一些元素上的.說(shuō)明一下:TYPE(類型), FIELD(屬性), METHOD(方法), PARAMETER(參數(shù)), CONSTRUCTOR(構(gòu)造函數(shù)),LOCAL_VARIABLE(局部變量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(類型)是指可以用在Class,Interface,Enum和Annotation類型上.

另外,從1的源代碼可以看出,@Target自己也用了自己來(lái)聲明自己,只能用在ANNOTATION_TYPE之上.
如果一個(gè)Annotation類型沒(méi)有指明@Target使用在哪些元素上,那么它可以使用在任何元素之上,這里的元素指的是上面的八種類型.

舉幾個(gè)正確的例子:

@Target(ElementType.METHOD)
@Target(value=ElementType.METHOD)
@Target(ElementType.METHOD,ElementType.CONSTRUCTOR) 

具體參考一下javadoc文檔

上面一下1和2的源文件,它們都使用了@Documented,@Documented的目的就是讓這一個(gè)設(shè)計(jì)Annotation類型的信息能夠顯示在javaAPI說(shuō)明文檔上;沒(méi)有添加的話,使用javadoc生成API文檔的時(shí)候就會(huì)找不到這一個(gè)類型生成的信息.

另外一點(diǎn),如果需要把Annotation的數(shù)據(jù)繼承給子類,那么就會(huì)用到@Inherited這一個(gè)Annotation類型.

感謝各位的閱讀!關(guān)于“Java中如何設(shè)計(jì)自己的Annotation”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI