JAVA中的注解機(jī)制解讀
不知道大家在平時用到注解的頻率多不多,注解對我們的幫助很大,能為我們節(jié)省很多工作。最直接的就是可以代替配置文件的功能,無論是基本的servlet還是常用的三大框架,里面都使用了注解,并且逐漸的代替了原本繁瑣的配置,大大提高了編碼效率。
隨著注解使用的越來越頻繁,我們對底層實(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)的類、方法、成員變量的對象的isAnnotationPresent方法判斷是否使用了注解。之后通過調(diào)用相應(yīng)的類、方法、成員變量的的getAnnotation方法得到相應(yīng)的注解的對象。接下來我們就可以操作注解對象完成相應(yīng)的邏輯。
我們來熟悉一下注解的基本結(jié)構(gòu):
最上面的一部分注解叫做元注解,就是注解的注解。@Target 指的是這個注解可以用在什么地方。他的參數(shù)可以有如下:
接著就是@Retention了,它指的是這個注解的生命周期。他的參數(shù)可以包括SOURCE、CLAS和 RUNTIME。
SOURCE:如果Retention成員取值為SOURCE,表明該注解只存在源代碼當(dāng)中,在編譯的時候會被編譯器丟掉。如重寫方法時,方法上面會有@Override注解,這個注解就是source類型的。
CLASS:表示注解會被存到字節(jié)碼文件.class中,但是虛擬機(jī)載入class文件的時候不會將注解導(dǎo)入,因此運(yùn)行時無法得到。如果不在注解中使用Retention指定,則默認(rèn)的保留策略為CLASS。
RUNTIME:不僅保存到class文件,還會被虛擬機(jī)載入內(nèi)存,因此在運(yùn)行的時候可以通過反射得到并且使用這些注解。我們待會的例子就是以RUNTIME為例。
而 @Inherited和@Documented表達(dá)的意思比較簡單:@Inherited 表示子類可以繼承父類的注解(有空會細(xì)講);@Documented 表示生成doc文檔的時候會包含這個注解。
“public @interface Anno”則是定義注解的關(guān)鍵字以及名字。接下來就是一些成員變量了,注意:這里是變量,不要以為有個括號就是方法了。使用方式是這樣的@Anno(name="wizard",age=12) 。
注意:成員變量只能是基本類型、String、class、enum、Annotation和以上類型的數(shù)組,而且必須是無參數(shù)、不能拋出異常。
到此這篇關(guān)于JAVA中的注解機(jī)制解讀的文章就介紹到這了,更多相關(guān)JAVA注解機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中進(jìn)程、協(xié)程與線程的區(qū)別詳解
這篇文章主要介紹了Java中進(jìn)程,線程,協(xié)程的概念、區(qū)別以及使用場景的選擇,早期的操作系統(tǒng)每個程序就是一個進(jìn)程,知道一個程序運(yùn)行完,才能進(jìn)行下一個進(jìn)程,就是"單進(jìn)程時代",一切的程序只能串行發(fā)生,需要的朋友可以參考下2023-08-08Struts2攔截器Interceptor的原理與配置實(shí)例詳解
攔截器是一種AOP(面向切面編程)思想的編程方式.它提供一種機(jī)制是開發(fā)者能夠把相對獨(dú)立的代碼抽離出來,配置到Action前后執(zhí)行。下面這篇文章主要給大家介紹了關(guān)于Struts2攔截器Interceptor的原理與配置的相關(guān)資料,需要的朋友可以參考下。2017-11-11java實(shí)現(xiàn)的導(dǎo)出Excel工具類實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)的導(dǎo)出Excel工具類,結(jié)合具體實(shí)例形式分析了java導(dǎo)出Excel導(dǎo)出并生成Excel表格相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-10-10Java網(wǎng)絡(luò)編程中的TCP/UDP詳解
這篇文章主要介紹了Java網(wǎng)絡(luò)編程中的TCP/UDP詳解,網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個設(shè)備的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來,java.net 包中 J2SE 的 API 包含有類和接口,它們提供低層次的通信細(xì)節(jié),需要的朋友可以參考下2023-12-12Java concurrency集合之CopyOnWriteArraySet_動力節(jié)點(diǎn)Java學(xué)院整理
CopyOnWriteArraySet基于CopyOnWriteArrayList實(shí)現(xiàn),其唯一的不同是在add時調(diào)用的是CopyOnWriteArrayList的addIfAbsent(若沒有則增加)方法2017-06-06java對象數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java對象數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06IntelliJ IDEA 2023.2正式發(fā)布新UI和Profiler轉(zhuǎn)正(最新推薦)
北京時間2023年7月26日,IntelliJ IDEA 2023.2正式發(fā)布,IntelliJ IDEA 2023.2 引入 AI Assistant(AI助手),通過一組由 AI 提供支持的功能助力開發(fā),今天給大家分享IntelliJ IDEA 2023.2正式發(fā)布新UI和Profiler轉(zhuǎn)正,感興趣的朋友一起看看吧2023-10-10