Java四種元注解介紹
Java四種元注解相關(guān)介紹
概述
注解從Java1.5引入以來,不斷地簡化我們編寫代碼的流程,逐漸的也成為了我們必學(xué)的一項(xiàng)技術(shù)。我們學(xué)習(xí)了各種注解,學(xué)習(xí)了他們的用法,學(xué)習(xí)了他們的限制,是否想過他們的組成呢,下面我將我對元注解的理解分享給大家。
元注解是用來修飾注解的注解,在java.lang.annotation包下,當(dāng)我們需要自己定義一個(gè)注解去做某些事情的時(shí)候,我們要對該注解進(jìn)行一些限制,確保我們注解的作用域,有的注解有屬性,有的注解沒有屬性,我們點(diǎn)進(jìn)去就能看到。這樣的注解一共有四個(gè),如下圖

定義一個(gè)注解用@interface來修飾文件類型,這四個(gè)元注解我們一個(gè)一個(gè)分析
@Documented

該注解是用來聲明,我們的注解是否能被Javadoc等API文檔生成工具展示出來,如果某個(gè)注解上面聲明了@Documented,就說明這個(gè)注解可以被那些生成文檔的工具展示出來。
我們點(diǎn)進(jìn)去可以看到,該注解用到了三個(gè)注解,其中有他自己,還有兩個(gè)元注解,并且這個(gè)注解沒有屬性,所以我們的使用方法很簡單,就是寫或者不寫該注解。
@Retention

我們點(diǎn)進(jìn)這個(gè)注解可以看到,首先他寫了@Documented,說明他是可以被文檔生成工具顯示到文檔中,并且他有一條屬性,他同樣也對自己使用了@Retention,并且給了一個(gè)值->RetentionPolicy.RUNTIME,可以看到跟我們上邊的@Documented注解是一樣的,然后我們點(diǎn)到RetentionPolicy這個(gè)類中去看看這個(gè)位置都可以給什么值

首先我們注意到了,這個(gè)類是個(gè)枚舉類,也就是說我們還可以這樣寫

那么這三個(gè)常量都代表什么意思呢
SOURCE:我們翻譯一下注釋:編譯器將丟棄注解就是說如果用了他,那么你的注解編譯成.class文件之后就會(huì)被丟掉,所以如果我們的注解是用來輔助編譯過程的,那么我們可以用它。
例如
@SuppressWarnings,我們通常用該注解來告訴編譯器忽略某些警告信息,編譯之后我們就不需要了,所以這個(gè)場景用SOURCE肯定是沒毛病的
CLASS:我們翻譯一下注釋:編譯器將注解記錄在類文件中,VM在運(yùn)行時(shí)不需要保留這些注釋。這是默認(rèn)設(shè)置行為。也就是說,編譯器編譯成.class文件后,這個(gè)注解仍然存在,但是在我們的jvm去加載.class文件的時(shí)候會(huì)被丟掉,這個(gè)使用的不多所以我們知道這個(gè)是什么意思就行。如果不寫,默認(rèn)就是選擇CLASS。
RUNTIME:使用率最高的一個(gè)常量,隨便去某個(gè)類庫里去查一下注解,點(diǎn)進(jìn)去基本都是RUNTIME。老樣子,我們先翻譯注釋:注釋將由編譯器記錄在類文件中,并在運(yùn)行時(shí)由VM定義,因此可以反射性地讀取。也就是說這個(gè)常量所定義的范圍是最大的了,都可以被反射了,也就是不光編譯器編譯了、JVM加載了還能反射性的讀取到,會(huì)一直存在。我們自己在定義注解的時(shí)候,除非有特殊需要,一般業(yè)務(wù)也是用這個(gè)常量,比較方便一些。@Target

由圖可以看到,這個(gè)元注解用到了三個(gè)元注解,有我們上邊說的兩個(gè)和他自己。此處我們不過多贅述。再看他的屬性,可以看到用到了中括號,說明注解的參數(shù)這里是可以放一個(gè)枚舉數(shù)組的,我們點(diǎn)開枚舉后可以看到聲明了很多常量。
老樣子先翻譯一下注釋,基本都能看出來是啥意思了,TYPE_PARAMETER和TYPE_USE是JDK1.8加進(jìn)來的
TYPE:類、接口(包括注解類型)或枚舉聲明。
- TYPE:類、接口(包括注解類型)或枚舉聲明。
- FIELD:字段聲明(包括枚舉常量)
- METHOD:方法聲明
- PARAMETER:形式參數(shù)聲明
- CONSTRUCTOR:構(gòu)造函數(shù)聲明
- LOCAL_VARIABLE:局部變量聲明
- ANNOTATION_TYPE:注釋類型聲明
- PACKAGE:包聲明
- TYPE_PARAMETER:類型參數(shù)聲明。該常量可以用于各種參數(shù)類型(包括類)的前面
- TYPE_USE:類型的使用。該常量可以用來標(biāo)注任何類型的名稱,包括
TYPE_PARAMETER的
所以我們可以根據(jù)我們的需要選擇此處的常量,當(dāng)然可以多選

例如這樣,按照圖片的寫法,這個(gè)@annotationT就既可以聲明在字段上,又可以聲明在方法上。
@Inherited

如圖可見,這個(gè)注解是一個(gè)可以被文檔生成工具顯示,不會(huì)被編譯器、JVM丟棄,且用到了ANNOTATION_TYPE,也就是說這個(gè)注解只能定義到注解上,所以他一定是用來規(guī)定注解的某些特性的。
老樣子我們翻譯一下上邊的注釋,由于篇幅較長此處不展示具體內(nèi)容,大佬們可以點(diǎn)進(jìn)去看看,大概是:被這個(gè)注解注釋的注解可以自動(dòng)繼承的,查詢類上的注解類型,如果類聲明沒有針對該類型的注解將自動(dòng)查詢超類(直到Object)
PS:請注意,如果注解類型用于注解類以外的任何內(nèi)容,則此元注解類型無效。還要注意,此元注解只會(huì)導(dǎo)致注解從超類繼承;已實(shí)現(xiàn)接口上的注解沒有影響。
簡單說,如果想讓你定義的注解被繼承,那就把@Inherited掛在你的注解上
總結(jié)
以上就是作用于我們所有注解上的元注解的基本信息,我們明白每個(gè)元注解代表什么意思會(huì)方便我們?nèi)ダ斫庖恍?code>JDK自帶的、或者第三方類庫中定義或使用的注解,也會(huì)方便我們自己去定義一些注解,比如可以用注解的方式實(shí)現(xiàn)在操作我們自定義的注解注釋的方法執(zhí)行之前或者之后要做些什么,當(dāng)我們真正會(huì)使用這些元注解去自定義屬于自己的注解的時(shí)候,一定會(huì)理解為什么注解使用的如此普遍。
到此這篇關(guān)于Java元注解介紹的文章就介紹到這了,更多相關(guān)Java元注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中使用Jedis操作Redis的實(shí)現(xiàn)代碼
本篇文章主要介紹了Java中使用Jedis操作Redis的實(shí)現(xiàn)代碼。詳細(xì)的介紹了Redis的安裝和在java中的操作,具有一定的參考價(jià)值,有興趣的可以了解一下2017-05-05
聊聊@value注解和@ConfigurationProperties注解的使用
這篇文章主要介紹了@value注解和@ConfigurationProperties注解的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問題
這篇文章主要介紹了MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java的常見熱門ORM框架優(yōu)缺點(diǎn)區(qū)別
Java?ORM框架是一種用于將Java對象映射到關(guān)系型數(shù)據(jù)庫中的工具,使得開發(fā)人員能夠通過對象操作數(shù)據(jù)庫而不必直接使用SQL查詢,Java開發(fā)變得更加高效和易于維護(hù),選擇適合你的ORM框架是根據(jù)你的需求決定的,比如你的應(yīng)用場景,數(shù)據(jù)結(jié)構(gòu)和技術(shù)水平等2024-02-02
Java中的concurrenthashmap集合詳細(xì)剖析
這篇文章主要介紹了Java中的concurrenthashmap集合詳細(xì)剖析,有參構(gòu)造后第一次put時(shí)會(huì)進(jìn)行初始化,由源碼可知,會(huì)先判斷所傳入的容量是否>=最大容量的一半,如果滿足條件,就會(huì)將容量修改為最大值,反之則會(huì)將容量改為所傳入數(shù)*1.5+1,需要的朋友可以參考下2023-11-11
Java實(shí)現(xiàn)兩人五子棋游戲(七) 屏幕提示信息
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,屏幕提示游戲信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Spring-cloud-eureka使用feign調(diào)用服務(wù)接口
這篇文章主要為大家詳細(xì)介紹了Spring-cloud-eureka使用feign調(diào)用服務(wù)接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
通過實(shí)例深入學(xué)習(xí)Java的Struts框架中的OGNL表達(dá)式使用
這篇文章主要通過實(shí)例介紹了Java的Strus框架中的OGNL表達(dá)式使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11

