一、什么是注釋 說(shuō)起注釋,得先提一提什么是元數(shù)據(jù)(metadata)。所謂元數(shù)據(jù)就是數(shù)據(jù)的數(shù)據(jù)。也就是說(shuō),元數(shù)據(jù)是描述數(shù)據(jù)的。就象數(shù)據(jù)表中的字段一樣,每個(gè)字段描述了這個(gè)字段下的數(shù)據(jù)的含義。而J2SE5.0中提供的注釋就是java源代碼的元數(shù)據(jù),也就是說(shuō)注釋是描述java源代碼的。在J2SE5.0中可以自定義注釋。使用時(shí)在@后面跟注釋的名字。 二、J2SE5.0中預(yù)定義的注釋 在J2SE5.0的java.lang包中預(yù)定義了三個(gè)注釋。它們是Override、Deprecated和SuppressWarnings。下面分別解釋它們的含義。 Override 這個(gè)注釋的作用是標(biāo)識(shí)某一個(gè)方法是否覆蓋了它的父類的方法。那么為什么要標(biāo)識(shí)呢?讓我們來(lái)看看如果不用Override標(biāo)識(shí)會(huì)發(fā)生什么事情。 |
|
假設(shè)有兩個(gè)類Class1和ParentClass1,用Class1中的myMethod1方法覆蓋ParentClass1中的myMethod1方法。
如果我們使用Override來(lái)修飾Class1中的myMethod1方法,當(dāng)myMethod1被誤寫(xiě)成別的方法時(shí),編譯器就會(huì)報(bào)錯(cuò)。因此,就可以避免這類錯(cuò)誤。
Deprecated 這個(gè)注釋是一個(gè)標(biāo)記注釋。所謂標(biāo)記注釋,就是在源程序中加入這個(gè)標(biāo)記后,并不影響程序的編譯,但有時(shí)編譯器會(huì)顯示一些警告信息。
運(yùn)行javac test.java 出現(xiàn)如下警告:
public void myMethod()注意:test.java 使用或覆蓋了已過(guò)時(shí)的 API。 注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:deprecation 重新編譯 使用-Xlint:deprecation顯示更詳細(xì)的警告信息: test.java:4: 警告:[deprecation] Class1 中的 myMethod() 已過(guò)時(shí) public void myMethod() ^ 1 警告 這些警告并不會(huì)影響編譯,只是提醒你一下盡量不要用myMethod方法。 SuppressWarnings 這個(gè)世界的事物總是成對(duì)出現(xiàn)。即然有使編譯器產(chǎn)生警告信息的,那么就有抑制編譯器產(chǎn)生警告信息的。 SuppressWarnings注釋就是為了這樣一個(gè)目的而存在的。讓我們先看一看如下的代碼。
注意:Testannotation.java 使用了未經(jīng)檢查或不安全的操作。 注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:unchecked 重新編譯。 這兩行警告信息表示List類必須使用范型才是安全的,才可以進(jìn)行類型檢查。如果想不顯示這個(gè)警告信息有兩種方法。一個(gè)是將這個(gè)方法進(jìn)行如下改寫(xiě): { List<String> wordList = new ArrayList<String>(); wordList.add("foo"); } 另外一種方法就是使用@SuppressWarnings。 @SuppressWarnings (value={"unchecked"}) public void myMethod() { List wordList = new ArrayList(); wordList.add("foo"); } 要注意的是SuppressWarnings和前兩個(gè)注釋不一樣。這個(gè)注釋有一個(gè)屬性。當(dāng)然,還可以抑制其它警告,如: @SuppressWarnings (value={"unchecked", "fallthrough"}) 三、如何自定義注釋
當(dāng)然,也可以定義有屬性的注釋。
除了可以省略屬性名,還可以省略屬性值。這就是默認(rèn)值。
如果要使用多個(gè)屬性的話。可以參考如下代碼。
四、如何對(duì)注釋進(jìn)行注釋 這一節(jié)的題目讀起來(lái)雖然有些繞口,但它所蘊(yùn)涵的知識(shí)卻對(duì)設(shè)計(jì)更強(qiáng)大的java程序有很大幫助。 在上一節(jié)討論了自定義注釋,由此我們可知注釋在J2SE5.0中也和類、接口一樣。是程序中的一個(gè)基本的組成部分。既然可以對(duì)類、接口進(jìn)行注釋,那么當(dāng)然也可以對(duì)注釋進(jìn)行注釋。 使用普通注釋對(duì)注釋進(jìn)行注釋的方法和對(duì)類、接口進(jìn)行注釋的方法一樣。所不同的是,J2SE5.0為注釋單獨(dú)提供了4種注釋。它們是Target、Retention、Documented和Inherited。下面就分別介紹這4種注釋。 Target 這個(gè)注釋理解起來(lái)非常簡(jiǎn)單。由于target的中文意思是“目標(biāo)”,因此,我們可能已經(jīng)猜到這個(gè)注釋和某一些目標(biāo)相關(guān)。那么這些目標(biāo)是指什么呢?大家可以先看看下面的代碼。
說(shuō)到這,大家可能已經(jīng)基本明白了。原來(lái)target所指的目標(biāo)就是java的語(yǔ)言元素。如類、接口、方法等。當(dāng)然,Target還可以對(duì)其它的語(yǔ)言元素進(jìn)行限制,如構(gòu)造函數(shù)、字段、參數(shù)等。如只允許對(duì)方法和構(gòu)造函數(shù)進(jìn)行注釋可以寫(xiě)成:
既然可以自定義注釋,當(dāng)然也可以讀取程序中的注釋(如何讀取注釋將在下一節(jié)中討論)。但是注釋只有被保存在class文件中才可以被讀出來(lái)。而Retention就是為設(shè)置注釋是否保存在class文件中而存在的。下面的代碼是Retention的詳細(xì)用法。
Documented 這個(gè)注釋和它的名子一樣和文檔有關(guān)。在默認(rèn)的情況下在使用javadoc自動(dòng)生成文檔時(shí),注釋將被忽略掉。如果想在文檔中也包含注釋,必須使用Documented為文檔注釋。
繼承是java主要的特性之一。在類中的protected和public成員都將會(huì)被子類繼承,但是父類的注釋會(huì)不會(huì)被子類繼承呢?很遺憾的告訴大家,在默認(rèn)的情況下,父類的注釋并不會(huì)被子類繼承。如果要繼承,就必須加上Inherited注釋。
五、如何使用反射讀取注釋
總結(jié) |
原文地址:http://www.java3z.com/cwbwebhome/article/article2/2769.html?id=1283
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||
相關(guān)文章:
|
||