日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Java Annotation的使用總結(jié)

系統(tǒng) 2094 0

?在上篇文章里提到的是JUnit的學(xué)習(xí),其中就涉及到了一些內(nèi)置的annotation,如@Test、@Ignore等。現(xiàn)在我就結(jié)合個(gè)人的理解談下如何自定義自己的annotation。

? annotation能被用來為某個(gè)程序元素(類、方法、成員變量等)關(guān)聯(lián)任何的信息,但annotaion不能影響程序代碼的執(zhí)行,無論增加、刪除annotation,代碼都始終如一的執(zhí)行。另外,盡管一些annotation通過java的反射api方法在運(yùn)行時(shí)被訪問,而java語言解釋器在工作時(shí)忽略了這些annotation。正是由于java虛擬機(jī)忽略了annotation,導(dǎo)致了 annotation類型在代碼中是“不起作用”的;只有通過某種配套的工具才會(huì)對(duì)annotation類型中的信息進(jìn)行訪問和處理,因而使用簡(jiǎn)便。

? 先說下定義annotation的語法。@interface是一個(gè)關(guān)鍵字,在自定義自己annotations的時(shí)候必須把一個(gè)類型定義為@interface,而不能用class或interface關(guān)鍵字,形如“public @interface MyAnnotation{ }”,以下是定義的幾個(gè)示例:

? 1.無任何方法/屬性Annotation

??

2,具有一個(gè)方法getValue( )的Annotation

3,? 具有一個(gè)特殊方法value( )的Annotation(特殊性下面會(huì)提到)

4,具有一個(gè)方法和屬性的Annotation

5,具有多個(gè)方法的Annotation

在上面的例子中可以看到,其實(shí)申明一個(gè)annotation和interface、class不同的是關(guān)鍵字@interface,而且它還可以對(duì)方法設(shè)置默認(rèn)的返回值,如上圖的“? public int getSingleNumber() default 0 ;???? ”,設(shè)置默認(rèn)返回0。還有個(gè)顯著的不同就是在申明每個(gè)Annotation的上面有幾個(gè)標(biāo)簽@Target、@Retention。

? annotation的target是一個(gè)被標(biāo)注的程序元素。target說明了annotation所修飾的對(duì)象范圍:annotation可被用于 packages、types(類、接口、枚舉、annotation類型)、類型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)。annotation的retention定義了該annotation被保留的時(shí)間長(zhǎng)短:某些annotation僅出現(xiàn)在源代碼中,而被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的annotation可能會(huì)被虛擬機(jī)忽略,而另一些在class被裝載時(shí)將被讀取(請(qǐng)注意并不影響class的執(zhí)行,因?yàn)閍nnotation與class在使用上是被分離的)。使用這個(gè)meta-annotation可以對(duì) annotation的“生命周期”限制。RetentionPolicy是一個(gè)enum類型,共有三個(gè)值,分別是SOURCE,CLASS 和 RUNTIME。SOURCE代表的是這個(gè)Annotation類型的信息只會(huì)保留在程序源碼里,源碼如果經(jīng)過了編譯之后,Annotation的數(shù)據(jù)就會(huì)消失,并不會(huì)保留在編譯好的.class文件里面。ClASS的意思是這個(gè)Annotation類型的信息保留在程序源碼里,同時(shí)也會(huì)保留在編譯好的.class文件里面,在執(zhí)行的時(shí)候,并不會(huì)把這一些信息加載到虛擬機(jī)(JVM)中去.注意一下,當(dāng)你沒有設(shè)定一個(gè)Annotation類型的Retention值時(shí),系統(tǒng)默認(rèn)值是CLASS. 第三個(gè),是RUNTIME,表示在源碼、編譯好的.class文件中保留信息,在執(zhí)行的時(shí)候會(huì)把這一些信息加載到JVM中去的。

? 下面是如何使用自己定義的annotation:

?

從上面的測(cè)試代碼可以看出:使用一個(gè)annotation的語法是 “@+annotation 類型名稱 +(.. 逗號(hào)分割的 name-value 對(duì) …)” 組成。其中成員可以按照任何的順序。如果 annotation 類型定義了某個(gè)成員的默認(rèn)值,則這個(gè)成員可以被省略。成員值必須為編譯時(shí)常量、內(nèi)嵌的 annotation 或者數(shù)組。

上面提到了一個(gè)特殊性,大家可以對(duì)比下上面的testMethod2和testMethod3上的annotation,會(huì)發(fā)現(xiàn)@OneMethodSpecialInAnnotation的值 ”Hello,world!”是沒有匹配的name,那么這個(gè)值 到底傳給誰了?其實(shí)這里有一個(gè)約定。如果沒有寫屬性名的值,而這個(gè)注釋又有 value 屬性,就將這個(gè)值賦給 value 屬性,相當(dāng)于是(value=”Hello,world!”)。

main方法是一個(gè)對(duì)上面進(jìn)行測(cè)試的,其輸出是:

the method testMethod1 is not wired!!
the method testMethod2 is not wired!!
the method testMethod3 is not wired!!
the method testMethod4 is not wired!!
the method testMethod5 is wired!!

為什么輸出“testMethod5 is wired”呢?因?yàn)閳?zhí)行了這句代碼:if (method.isAnnotationPresent(MultiMethodsInAnnotation.class))。@MultiMethodsInAnnotation是在testMethod5 上的,如果換成其他的annotation,也會(huì)得到相應(yīng)的提示。isAnnotationPresent()方法對(duì)于檢查marker annotation是十分有用的,因?yàn)閙arker annotation沒有成員變量,所以我們只要知道class的方法是否使用了annotation修飾就可以了。而當(dāng)處理具有成員的 annotation時(shí),我們通過使用getAnnotation()方法來獲得annotation的成員信息(成員名稱、成員值)。這里我們看到了一套優(yōu)美的java annotation系統(tǒng):如果annotation存在,那么實(shí)現(xiàn)了相應(yīng)的annotation類型接口的對(duì)象將被getAnnotation()方法返回,接著調(diào)用定義在annotation類型中的成員方法可以方便地獲得任何成員值。

? 現(xiàn)在我們?cè)賮韨€(gè)High點(diǎn)的,如何訪問一個(gè)annotation里的各個(gè)方法,如下:

? 至此,感覺自己學(xué)到的也就這么多了,也不知道是不是太膚淺。相信Annotation技術(shù)在不久的將來將得到更好的發(fā)展!至于在實(shí)際測(cè)試中用到的DBunit中的@DataSet macker是如何將場(chǎng)景數(shù)據(jù)自動(dòng)插入到數(shù)據(jù)庫的源碼學(xué)習(xí),將在以后的總結(jié)中給出。希望各位多提寶貴意見,支持新手哦!

Java Annotation的使用總結(jié)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 木兰县| 大石桥市| 监利县| 镇江市| 西畴县| 许昌市| 定州市| 丰都县| 郎溪县| 呼玛县| 沾益县| 福安市| 莱州市| 平泉县| 屏南县| 白朗县| 古丈县| 阳泉市| 盐源县| 大兴区| 彰化市| 岱山县| 璧山县| 和林格尔县| 崇文区| 临澧县| 宁化县| 长沙县| 中牟县| 大方县| 陇南市| 葵青区| 汝州市| 本溪市| 长岭县| 峨山| 白玉县| 马山县| 顺义区| 永城市| 碌曲县|