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