資源共享吧|易語(yǔ)言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡(luò)安全教程|m.anzei.cn|我的開發(fā)技術(shù)隨記

 找回密碼
 注冊(cè)成為正式會(huì)員
查看: 1372|回復(fù): 0
打印 上一主題 下一主題

[JAVA] 通俗易懂的講解下Java注解

[復(fù)制鏈接]

3

主題

85

帖子

0

精華

終身高級(jí)VIP會(huì)員

Rank: 7Rank: 7Rank: 7

資源幣
8
積分
88
貢獻(xiàn)
0
在線時(shí)間
18 小時(shí)
注冊(cè)時(shí)間
2020-4-24
最后登錄
2021-11-15

終身VIP會(huì)員

跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-1-2 14:22:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 56762443 于 2021-1-2 14:26 編輯

對(duì)于Java注解,我咨詢過一些身邊的人,很多人表示:

知道怎么用,不熟悉
不知道你是不是這樣?在我沒有系統(tǒng)性的學(xué)習(xí)一邊注解的時(shí)候,我也是如此,在我花時(shí)間學(xué)習(xí)過注解之后,我覺得,對(duì)于注解,最重要的在于理解,很多人也看過不少關(guān)于注解的文章,可是過不了多久就會(huì)忘記,關(guān)于遺忘,這不是個(gè)問題,只能說是正,F(xiàn)象。
但是對(duì)于一個(gè)知識(shí)點(diǎn),你理解的越透徹也就越不容易忘記,所以今天我準(zhǔn)備通俗易懂的和大家聊聊Java注解,爭(zhēng)取讓大家有自己的理解,盡量記住這個(gè)重要的知識(shí)點(diǎn)!
什么是注解?

我們學(xué)習(xí)注解的第一步,首先就是先從最基本的開始,看看注解到底是什么?

注解和反射是Java中非常讓人容易忽略的東西,但卻很重要,在主流的Spring中更是充滿了注解,注解和注釋很像,兩者其實(shí)本質(zhì)就差不多,注釋是給我們程序員看的,而注解呢其實(shí)就是給程序看的(關(guān)于反射,下一篇咱就開講)
上面所說希望你著重注意以下兩點(diǎn):
1、注解和注釋很像2、注釋是給我們程序員看的,而注解呢其實(shí)就是給程序看的
我們初步理解注解就從上面兩點(diǎn)開始,我們先看注釋,比如這樣:



這就是一個(gè)注釋,那么注釋有什么用呢?簡(jiǎn)單來說就是對(duì)相關(guān)的類或者方法加以說明,比如這里的Test類,上面的注釋大致告訴我們這類是誰編寫的,做什么的以及何時(shí)編寫的這些信息,當(dāng)然,信息其實(shí)還可以有更多。
所以,你要明白,注釋是干嘛的,是給我們這些程序員看的,看到注釋我們就明白了,哦,這個(gè)類原來是這樣的……
注釋是給程序員看的,那么注解呢?相差一個(gè)字,注解是給程序看的,先記住即可。
進(jìn)一步理解注解

上面我們說了,注解和注釋是很像的,注釋是給我們?nèi)丝吹,注解就是給程序看的,前面的好理解,這個(gè)注解是給程序看的,你或許還有一點(diǎn)懵,我進(jìn)一步解釋下。
首先,直觀感覺下什么是注解,比如我們?cè)诖a中寫的這個(gè):
/** * @Description 用戶類 * @Author ithuangqing * @Date 2020-07-31 15:33 **/@Repositorypublic class UserBean {    private String name;    private int age;}12345678910這里的@Repository就是一個(gè)注解,看這段代碼,上面還有注釋,我們看到注釋,發(fā)現(xiàn)都看得明白,但是看到@Repository之后,就不那么明白,這是啥,有啥用?
于是我們查,大概知道,哦,這是個(gè)注解,有了這個(gè)注解,UserBean就會(huì)被裝載進(jìn)Spring容器中,我們可以知道這些信息,但是,它實(shí)際上做了哪些事情,是如何起作用,也就是如何把UserBean交給Spring去處理的,這個(gè)內(nèi)部實(shí)現(xiàn),我們不清楚。
但是,我們雖然不清楚,有個(gè)東西它清楚,什么呢?就是一個(gè)特定的程序,也就是說,有一個(gè)專門的程序,當(dāng)它看到這個(gè)UserBean上面有一個(gè)@Repository之后,這個(gè)程序就知道了,原來要把這個(gè)UserBean裝載進(jìn)Spring容器中,于是這個(gè)程序員就開始執(zhí)行一系列的操作區(qū)把這個(gè)UserBean裝載進(jìn)Spring容器中。
所以,你到此應(yīng)該明白:

注釋是給人看到的,注解是給程序看的。
我們?cè)龠M(jìn)一步總結(jié)下什么是注解:

在程序中,可以把注解看成一種特殊的標(biāo)記,一般是用來標(biāo)記類,方法或者接口等,這些標(biāo)記有一些特點(diǎn),比如可以在編譯的時(shí)候,(javac命令把java源文件編譯成字節(jié)碼文件class),類加載和運(yùn)行的時(shí)候(使用java命令執(zhí)行字節(jié)碼文件的時(shí)候,類的生命周期開始,從加載到卸載)被讀取到(一般是有專門的程序去讀區(qū)這些注解,利用反射技術(shù)去解析注解,然后根據(jù)得到的信息做相應(yīng)的處理)
是的,關(guān)于注解,你要知道這么一個(gè)知識(shí)點(diǎn)了:

對(duì)于注解,是有專門的程序去讀取它,解析它,然后根據(jù)得到的消息去執(zhí)行相應(yīng)的操作。
關(guān)于這個(gè)程序,要看具體的場(chǎng)景,也就是說這個(gè)程序是不同的,那么關(guān)于這個(gè)程序怎么知道讀到哪個(gè)注解該干嘛,這個(gè)還是依靠注解本身的定義,比如@Repository注解被定義成是把被注解的裝載進(jìn)Spring容器中,那么特有的程序獲取到這個(gè)注解就知道該干什么事了。
到此,你應(yīng)該知道什么是注解了,當(dāng)然,是概念上的一些東西,另外,對(duì)注解是怎么起作用的,你也應(yīng)該有點(diǎn)內(nèi)味了……
注解的簡(jiǎn)單分類

這個(gè)知識(shí)點(diǎn)很是輕松愉快,不需要你失去多少腦細(xì)胞。
注解是有分類的,一般有三種類型的注解:




      自定義注解(實(shí)際很少)JDK內(nèi)置注解(@Override檢驗(yàn)方法重寫)框架中的注解

不知道這個(gè)能不能理解,就是說,對(duì)于注解而言,是有幾種不同分類的,首先,我們可以自己寫一個(gè)注解出來(下面會(huì)講),另外對(duì)于JDK本身而言有自己的的注解,我們看個(gè)代碼,你就知道了:



比如這個(gè),是重寫toString方法,上面就有個(gè)JDK的內(nèi)置注解@Override,這個(gè)注解就起到一個(gè)檢驗(yàn)的作用,因?yàn)樗荗bject的方法,你現(xiàn)在要重寫它,那么名字啊,參數(shù)啊要和之前的一樣,不一樣,就給你報(bào)錯(cuò),不信你試試:



這個(gè)是關(guān)于JDK的內(nèi)置注解,那么最后一個(gè)關(guān)于框架的注解,我想你只要學(xué)過Spring都知道,比如@Controller,熟悉吧,這就是框架中的注解。
注解的本質(zhì)

經(jīng)過上面的講解,我們應(yīng)該大致了解了什么是注解,以及注解的一些分類,現(xiàn)在,我們對(duì)于概念上的注解算是清楚了,但是這個(gè)注解本質(zhì)是個(gè)什么呢?
告訴你吧,注解的本質(zhì)是個(gè)接口,為啥,先來看下,如何定義一個(gè)注解(下面會(huì)詳細(xì)講解)
public @interface Main {}12就這些,就定義了一個(gè)注解,不知道你發(fā)現(xiàn)了沒,這個(gè)和接口很像啊,有啥區(qū)別,就是多了一個(gè)@,不然就是接口啊,接下來我們使用XJad把這個(gè)注解反編譯一下看看:



看到?jīng)],這里的Main直接就是interface定義,然后還繼承了Annotation,這個(gè)足以說明,注解其實(shí)就是接口啊。
這個(gè)暫且聊到這,記住即可!
如何定義注解

接下來我們就來聊聊如何去自定義一個(gè)注解,我們?cè)谏厦嬲f過,注解的本質(zhì)其實(shí)就是接口,上面也簡(jiǎn)單演示了一個(gè)注解的定義,如下:
public @interface Main {}12想一下,我們平常怎么定義一個(gè)接口,是不是使用關(guān)鍵字interface,那么類呢?是不是使用class關(guān)鍵字,也就是說啊,定義這些一般都是需要一個(gè)關(guān)鍵字來加以聲明的,顯而易見,定義注解的關(guān)鍵字就是@interface,它和接口的定義就是多了一個(gè)@,但是注解的定義卻不僅僅是如此!
元注解

這里要引入一個(gè)元注解的概念,我們先來想一下,注解我們上面說了,一般可以用來標(biāo)記類,接口或者方法等,那么這里就有一個(gè)問題了,比如我定義了這么一個(gè)Main注解:
public @interface Main {}12那么,我這個(gè)注解是不是可以用在類上,也可以用在接口或者方法上?一般類呀,接口啊,方法啊等等它們還是有點(diǎn)差別的,所以對(duì)于這些最好有區(qū)分,也就是說,有些注解只能標(biāo)記類,有些注解只能標(biāo)記方法等,這樣一來就需要對(duì)注解的作用域去進(jìn)行限制。
那么這個(gè)該怎么搞,答案就是元注解,那什么是元注解呢?

元注解就是標(biāo)記注解的注解
啥意思,來看下,比如我們定義的這個(gè)Main注解,我們規(guī)定它只能用來標(biāo)記方法,那么可以這樣做:



我們?cè)谏厦婕恿艘粋(gè)注解@Target,后面還有參數(shù)(下面會(huì)講),這個(gè)參數(shù)ElementType.METHOD就代表我們這個(gè)注解是用于注解方法的,來,試一下:



你看,可以用在我們的main方法上,那么是不是不能用于類呢?我們?cè)囅拢?br />


報(bào)錯(cuò)了,看來是不行,所以這個(gè)@Target就是一個(gè)元注解,可以用來注解注解,也就是標(biāo)記注解的注解。
關(guān)于元注解,一般有以下主要的幾個(gè):




      @Documented 用于制作文檔@Target 指定注解的使用位置,不指定的話任何位置都可以使用@Retention(注解的保留策略)

這里單獨(dú)提一下最后一個(gè)也就是聲明注解的保留策略@Retention,這個(gè)是什么意思呢?
這個(gè)保留策略啊,簡(jiǎn)單來講就是說你這個(gè)注解可以在哪個(gè)時(shí)間段起作用,這個(gè)就得說說我們的代碼從寫出來,然后編譯到執(zhí)行的主要三個(gè)階段了,畫個(gè)圖就是這樣的:



這個(gè)我已經(jīng)畫的很清楚了吧,一般來說,我們的注解都是要保留到運(yùn)行期間的,所以一般就是這樣:



當(dāng)然,具體情況具體對(duì)待。
到這里你可能發(fā)現(xiàn),這個(gè)注解里面可以有參數(shù)?當(dāng)然是可以的,我這里簡(jiǎn)單演示下,下面講到注解的語(yǔ)法的時(shí)候你就知道了:



然后再看下使用:



其實(shí)還是蠻簡(jiǎn)單的!
注解的基本使用語(yǔ)法

接下來我們就來看看注解的語(yǔ)法吧,就是注解具體是如何使用的。
對(duì)于注解,我們知道了如何去定義它,比如簡(jiǎn)單定義一個(gè)注解:



這很簡(jiǎn)單,我們繼續(xù)去看,對(duì)于注解還可以定義屬性:



雖然這個(gè)屬性看起來很像方法,但是人家就是屬性,注解還是比較特殊的,那么現(xiàn)在我們來使用下這個(gè)注解:



這個(gè)時(shí)候它會(huì)報(bào)錯(cuò),告訴我們需要一個(gè)value值,其實(shí)也好理解,你的注解定義中定義的有一個(gè)value屬性,那么你在使用的時(shí)候就需要把這個(gè)屬性值給用上,那你說我可不可以不用,可以的,那定義注解屬性的時(shí)候就需要給屬性添加默認(rèn)值,就是這樣:



可以設(shè)置成一個(gè)空字符串也可以設(shè)置成具體的值。除此之外我們還可以設(shè)置多個(gè)屬性值,像這樣:



這里就有知識(shí)點(diǎn)了,如果你在使用的時(shí)候只是給一個(gè)屬性值賦值,那么在使用的時(shí)候可以這樣:



那有人可能疑問,我這個(gè)hello對(duì)應(yīng)的是value還是name啊,默認(rèn)對(duì)應(yīng)的都是value,所以這個(gè)要牢記。
但是給多個(gè)屬性值賦值的時(shí)候就必須指明具體的屬性名稱了,就是這樣:




PS:通過上面的介紹我們會(huì)發(fā)現(xiàn)注解一個(gè)比較奇怪的地方,就是對(duì)于注解而言,我們可以定義屬性,但是注解的屬性長(zhǎng)得真的像方法,但是在注解里面,它就是屬性,就可以直接賦值,這里需要注意下!
屬性的類型

上面簡(jiǎn)單介紹了注解的屬性,那么這些屬性都是可以取哪些類型值呢?大致有如下這么多:




      基本數(shù)據(jù)類型String枚舉Class注解類型數(shù)組(以上類型的一維數(shù)組)

關(guān)于數(shù)組的看個(gè)例子,比如這樣:



使用的時(shí)候也是同樣的道理:



如何真正的理解注解

我們平常對(duì)于注解之所以忽視的原因在于,很多地方只需要我們?nèi)ナ褂茫热邕@樣:



至于注解是怎么定義的以及注解是怎么起作用的都不太了解,好像需要我們自定義注解的也都很少,所以不去系統(tǒng)化的學(xué)習(xí)注解的話,會(huì)忽略掉注解的很多東西,只會(huì)使用,也就是@XXX
那么,從今天開始,我希望你能夠記住,對(duì)于注解而言,它一定有如下三個(gè)流程:




      定義注解使用注解讀取并執(zhí)行相應(yīng)流程

下面我們就以@Repository這個(gè)注解來看看這三個(gè)流程,首先是定義注解,這個(gè)我們可以在IDEA中按住Ctrl點(diǎn)進(jìn)去@Repository來看,是這樣的:



]()
這個(gè)就是@Repository注解的定義,接著我們看看@Repository的使用:



然后就是對(duì)注解的讀取了,怎么讀取呢?很多人對(duì)這塊是比較模糊的,這也是對(duì)注解理解最大的障礙所在。
我們一般就是使用注解,對(duì)于注解的定義和讀取這塊一般都是框架什么的給我們搞定了,我們不看源碼一般不知道是怎么回事的,也就不清楚注解到底是怎么運(yùn)行起來的,簡(jiǎn)單的理解就是注解需要靠反射去讀取,然后做相應(yīng)的處理。
但是我想你一定和我一樣好奇,為啥加了個(gè)@Repository注解之后,這個(gè)UserBean就被裝載進(jìn)Sring容器中生成了一個(gè)bean呢?
還記得我在最開始就一直在說的嗎?注解是需要有專門的程序取讀取的,然后根絕讀取到的注解獲取的信息去執(zhí)行相應(yīng)的操作。
所以這里,在Spring源碼中,一定有某個(gè)或者某些程序在做這個(gè)事情。
注解的讀。ㄗ⒔馊绾纹鹱饔茫

上面說了注解的定義何使用,在這里單獨(dú)把注解的讀取拿出來說下,因?yàn)檫@點(diǎn)事理解注解的重點(diǎn),很多人覺得對(duì)注解不理解的一個(gè)原因就在于不清楚加了個(gè)注解之后到底干了啥?
也就是注解到底是如何起作用的?搞明白這個(gè),將對(duì)你理解注解有極大的幫助。
注解主要被反射讀取

對(duì)于注解的讀取,一般就是通過反射技術(shù)來實(shí)現(xiàn),這里就有知識(shí)點(diǎn)了,對(duì)于反射而言,它只能讀取內(nèi)存中的字節(jié)碼信息,然后還記得之前我們說的注解的作用域@Target嗎?
它里面有幾個(gè)主要的作用域,也就是這張圖片,再來回顧下:



對(duì)于RetentionPolicy.CLASS而言,這個(gè)就是指的字節(jié)碼這一階段,這個(gè)時(shí)候這個(gè)字節(jié)碼文件是由Java源文件通過javac編譯生成,這個(gè)時(shí)候class字節(jié)碼文件其實(shí)還是在磁盤內(nèi),并沒有進(jìn)入內(nèi)存中。
而反射只能取讀取內(nèi)存中的字節(jié)碼信息,所以注解的保留策略也就是這個(gè)@Target只能是RUNTIME,也即運(yùn)行的時(shí)候仍然可以讀取。
我的理解(精華)

很多人對(duì)注解不理解,或者覺得很模糊的一個(gè)原因就是你讓我定義一個(gè)注解,我也能按照基本的注解語(yǔ)法去定義一個(gè)注解,你說怎么使用注解我也知道在類,方法等上面使用 @+注解名稱的方式,但是也就到此為主了,更進(jìn)一步的理解就有點(diǎn)模糊了,比如:




      為什么要這樣用?原理是什么,怎么起作用的?

你想啊,我們就這樣在類或者方法上面寫了這么一個(gè)@+注解名稱就行了?后續(xù)是怎么起作用的呢?這里你得首先清楚,注解有三大步驟:




      定義注解使用注解讀取注解(這塊是大部分人缺少的,也是大部分人對(duì)注解不理解的關(guān)鍵所在)

再理解下什么是注解,與注釋一字之差,肯定有相似之處,兩者都是提供額外信息的,好比備注,注釋是給我們程序員看到,看到注釋我們知道某個(gè)類是干啥的,有啥用,看到方法的注釋,我們知道這個(gè)方法有什么作用需要什么參數(shù)以及參數(shù)的含義等等,那么注解嘞,注解其實(shí)是給程序看到,當(dāng)程序讀到注解,會(huì)從注解這里得到一些信息,知道該如何處理被該注解標(biāo)記的類或方法等。
好好理解上面的,我們下面再以Spring的一個(gè)例子來加以說明。
對(duì)于Spring簡(jiǎn)單的大家都知道IOC吧,直白點(diǎn)就是不用你new對(duì)象,需要什么直接從Spring容器中獲取,那么首先就需要把我們的bean注冊(cè)到Spring容器中吧,這個(gè)一般有xml配置方式和注解方式,當(dāng)然我們這里要說的是注解方式,也就是使用@+注解名稱的形式,舉個(gè)簡(jiǎn)單的例子,如下:



這個(gè)注解熟悉吧,它就是可以把我們的Person類注冊(cè)到Spring容器中去,當(dāng)然,這里就是在對(duì)這個(gè)注解的使用,我們點(diǎn)進(jìn)去看看這個(gè)注解是怎么定義的:



這個(gè)定義我們應(yīng)該已經(jīng)熟悉了,對(duì)于@Component也是一個(gè)注解,它其實(shí)是最基礎(chǔ)的把類注冊(cè)到Spring容器中的注解,后來的像我們現(xiàn)在說的@Repositoy以及@Service和@Controller這些都是在@Component的基礎(chǔ)上發(fā)而來。
這里就需要注意了,其實(shí)這幾個(gè)注解不管是哪個(gè),都要清楚明白的一點(diǎn)就是,要它們啥用,之所以需要這些注解,就是希望在哪個(gè)類上使用這些注解,就自動(dòng)把這個(gè)類注冊(cè)到Spring容器中,這個(gè)要比我們寫xml配置簡(jiǎn)單的多,我們就在一個(gè)類上寫個(gè)@Repositoy,它就被注冊(cè)到Spring容器中了?
是不是很神奇,然后看下注解的定義,也很簡(jiǎn)單,沒啥東西啊,怎么就自動(dòng)注冊(cè)到Spring容器中了呢?
還記得之前說的注解三大步驟嘛?首先你需要定義一個(gè)注解,然后就是使用注解,那么注解是怎么起作用的就需要有程序去讀注解,這個(gè)注解就好比一個(gè)標(biāo)志,一個(gè)標(biāo)簽一樣,比如這里的@Repositoy,當(dāng)一個(gè)類被這個(gè)注解標(biāo)志,那么當(dāng)特有的程序去讀到這個(gè)注解的時(shí)候,這個(gè)程序就知道,哦,原來是要把這類注冊(cè)到Spring容器中啊,那么程序怎么知道要把這個(gè)類注冊(cè)到Spring容器中呢?這就是 @Repositoy 告訴它的。另外我們知道注解一般可以設(shè)置一個(gè)value屬性值,可以通過反射技術(shù)拿到之類的,那么在具體的將這個(gè)類注冊(cè)到Spring容器的過程中可能就會(huì)用到這個(gè)value屬性值,比如設(shè)置成bean的名字。
我們一般使用了注解,在Spring配置文件中就需要配置注解的包掃描:
<context:component-scan base-package="com.ithuangqing.*"/>1這個(gè)其實(shí)就是在掃描,看看哪個(gè)類上使用到了@Repositoy這些注解,掃描到的就需要特殊處理將其注冊(cè)到Spring容器。想一下,這里Spring其實(shí)就會(huì)對(duì)這個(gè)標(biāo)簽進(jìn)行解析,核心代碼:
registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());1然后具體的處理流程就是在ComponentScanBeanDefinitionParser處理,代碼如下:
@Override        public BeanDefinition parse(Element element, ParserContext parserContext) {                String basePackage = element.getAttribute(BASE_PACKAGE_ATTRIBUTE);                basePackage = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(basePackage);                String[] basePackages = StringUtils.tokenizeToStringArray(basePackage,                                ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);                // Actually scan for bean definitions and register them.                ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element);    //得到掃描器                Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);             //掃描文件,并轉(zhuǎn)化為spring bean,并注冊(cè)                registerComponents(parserContext.getReaderContext(), beanDefinitions, element);       //注冊(cè)其他相關(guān)組件                return null;        }1234567891011121314上述代碼的主要作用就是掃描base-package 下的文件,然后把它轉(zhuǎn)換為Spring中的bean結(jié)構(gòu),接著將其注冊(cè)到容器中……
怎么樣,是不是越來越看不懂代碼?很正常,這里只需要大家記住,注解是會(huì)被特有的程序去讀取,然后去做相關(guān)的處理的,而這個(gè)處理邏輯,一般就比較復(fù)雜了,尤其框架中。
獲取注解的屬性

上面講解的關(guān)于注解是如何起作用的是很重要的,一定要理解,下面我們聊聊注解使用的最后一步:特有的程序去讀取注解。
注解使用最終是需要依靠程序去讀取注解,得到注解的一些信息,然后才判斷接下來應(yīng)該去做什么事情,那么接下來我們就要知道注解的屬性值該如何獲取。
其實(shí)注解的屬性,用到的技術(shù)就是反射,反射是一個(gè)很重要的知識(shí)點(diǎn),以后會(huì)單獨(dú)寫文通俗易懂的去聊一聊的。
接下來我們來看如何使用反射來獲取注解的屬性。,主要就是一下三個(gè)基本的方法:
/**是否存在對(duì)應(yīng) Annotation 對(duì)象*/public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {    return GenericDeclaration.super.isAnnotationPresent(annotationClass);}/**獲取 Annotation 對(duì)象*/public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {    return (A) annotationData().annotations.get(annotationClass);}/**獲取所有 Annotation 對(duì)象數(shù)組*/   public Annotation[] getAnnotations() {    return AnnotationParser.toArray(annotationData().annotations);}1234567891011121314151617然后接下來看一段簡(jiǎn)單的代碼:演示利用注解獲取注解屬性
public class Test {    public static void main(String[] args) throws Exception {        Class<Test> testClass = Test.class;        Method toGetString = testClass.getMethod("toGetString");        //獲取注解對(duì)象        Main main = toGetString.getAnnotation(Main.class);        System.out.println(main.value());    }    @Main("這是自定義注解的value值")    public static String toGetString() {        return "";    }}123456789101112131415其實(shí)很簡(jiǎn)單,記住以上三個(gè)獲取注解的方法,關(guān)于反射我們后面會(huì)詳細(xì)聊聊。
到現(xiàn)在基本知道了注解需要先定義出來,然后使用,那么怎么起作用,大概就是需要一個(gè)程序去專門利用反射技術(shù)去讀取注解,得到注解里面的信息然后做相應(yīng)的事情。
總結(jié)

到這里,關(guān)于注解的講解其實(shí)就差不多了,也許你看了也就忘了,也許你根本就沒有看完,但是我希望記住一下內(nèi)容:




      定義注解使用注解讀取注解

評(píng)分

參與人數(shù) 1資源幣 +3 收起 理由
小朋友呢 + 3 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

 點(diǎn)擊右側(cè)快捷回復(fù)  

本版積分規(guī)則

小黑屋|資源共享吧 ( 瓊ICP備2023000410號(hào)-1 )

GMT+8, 2024-12-27 14:17 , Processed in 0.047268 second(s), 13 queries , MemCached On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回復(fù) 返回頂部 返回列表