Docker 的優(yōu)點(diǎn)
612
2025-04-01
不知道大家在平時(shí)用到注解的頻率多不多,注解對(duì)我們的幫助很大,能為我們節(jié)省很多工作。最直接的就是可以代替配置文件的功能,無論是基本的servlet還是常用的三大框架,里面都使用了注解,并且逐漸的代替了原本繁瑣的配置,大大提高了編碼效率。
隨著注解使用的越來越頻繁,我們對(duì)底層實(shí)現(xiàn)的了解越來越少,所以在這一章我們來好好了解一下注解是怎么實(shí)現(xiàn)的。
首先注解是什么?通俗的意思是為程序的元素(類、方法、成員變量)加上更直觀更明了的說明(比如 @Override),這些說明信息是與程序的業(yè)務(wù)邏輯無關(guān),并且是供指定的工具或框架使用的。
他的基本原理和流程就是:通過調(diào)用Java的反射機(jī)制相關(guān)API來訪問annotation信息。首先加載使用注解的類,得到class類。然后再得到類相應(yīng)的方法,成員變量。得到變量后調(diào)用相應(yīng)的類、方法、成員變量的對(duì)象的isAnnotationPresent方法判斷是否使用了注解。之后通過調(diào)用相應(yīng)的類、方法、成員變量的的getAnnotation方法得到相應(yīng)的注解的對(duì)象。接下來我們就可以操作注解對(duì)象完成相應(yīng)的邏輯。
我們來熟悉一下注解的基本結(jié)構(gòu):
最上面的一部分注解叫做元注解,就是注解的注解。@Target 指的是這個(gè)注解可以用在什么地方。他的參數(shù)可以有如下:
接著就是@Retention了,它指的是這個(gè)注解的生命周期。他的參數(shù)可以包括SOURCE、CLAS和 RUNTIME。
SOURCE:如果Retention成員取值為SOURCE,表明該注解只存在源代碼當(dāng)中,在編譯的時(shí)候會(huì)被編譯器丟掉。如重寫方法時(shí),方法上面會(huì)有@Override注解,這個(gè)注解就是source類型的。
CLASS:表示注解會(huì)被存到字節(jié)碼文件.class中,但是虛擬機(jī)載入class文件的時(shí)候不會(huì)將注解導(dǎo)入,因此運(yùn)行時(shí)無法得到。如果不在注解中使用Retention指定,則默認(rèn)的保留策略為CLASS。
RUNTIME:不僅保存到class文件,還會(huì)被虛擬機(jī)載入內(nèi)存,因此在運(yùn)行的時(shí)候可以通過反射得到并且使用這些注解。我們待會(huì)的例子就是以RUNTIME為例。
而 @Inherited和@Documented表達(dá)的意思比較簡(jiǎn)單:@Inherited
表示子類可以繼承父類的注解(有空會(huì)細(xì)講);@Documented 表示生成doc文檔的時(shí)候會(huì)包含這個(gè)注解。
“public @interface Anno”則是定義注解的關(guān)鍵字以及名字。接下來就是一些成員變量了,注意:這里是變量,不要以為有個(gè)括號(hào)就是方法了。使用方式是這樣的@Anno(name=“wizard”,age=12) 。
注意:成員變量只能是基本類型、String、class、enum、Annotation和以上類型的數(shù)組,而且必須是無參數(shù)、不能拋出異常。
Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。