天天看點

黑馬程式員_Jav基礎加強之注解(annotation)

--------- android教育訓練、java教育訓練、期待與您交流!----------

一、了解注解

   從JDK1.5版本開始,Java增加Annotation(注解),注解相當于一種标記,在程式中加了注解就等于為程式打上了某種标記,這些标記可以在編譯(SOURCE)、類加載(CLASS)、運作時(RUNTIME)被讀取,并執行相應的處理。通過使用Annotation,程式開發人員可以在不改變原有邏輯的情況下,在源檔案中嵌入一些補充的資訊。代碼分析工具、開發工具和部署工具可以通過這些補充資訊進行驗證或都進行部署。

   Annotaion能被用來為程式元素(類、方法、成員變量等)設定中繼資料它不影響程式代碼的執行,無論增加、删除Annotation,代碼都始終如一地執行。如果希望讓程式中的Annotation在運作時起一定的作用,隻有通過某種配套的工具對Annotation中的資訊進行通路和處理,通路和處理Annotation的工具統稱為APT(Annotation Processing Tool)。

二、基本Annotation

JDK1.7新增了一個,是以有4個:

@Override

@Deprecated

@SuppressWarnings

@SafeVarargs

1、限定重寫父類方法:@Override

   @Override隻能作用于方法,不能作用于其他程式元素。它的作用是告訴編譯器檢查這個方法,保證父類要包含一個被該方法重寫的方法,否則就會編譯出錯。它有助于程式員避免犯一些低級錯誤。

   如:

2、标示已過時:@Deprecated

   @Deprecated用于表示某個程式元素(類、方法等)已過時,當其他程式使用已時的類、方法時,編譯器将會給出警告。如下程式:

3、抑制編譯器警告:@SuppressWarnings

   @SuppressWarnings訓示被Annotation修飾的程式元素(以及該程式元素中的所有子元素)取消顯示指定的編譯器警告。值得注意的是,這個标記會把作用于該程式元素的所有子元素,當它修飾的方法中有多個編譯器的警告它會同時取消顯示這些編譯器警告。

①示例一:

注:如果Annotation裡隻有一個value成員變量,使用該Annotation時可以直接在Annotation後的括号裡指定value成員變量的值,無須使用name=value的形式。

②示例二:

③示例三:

4、"堆污染"警告與@SafeVarargs

   Java把引發這種錯誤原因稱為"堆污染"(Heap pollution),當把一個不帶泛型的對象賦給泛型的變量時,往往會發生這種"堆污染",如上①所在行代碼所示。

如:

三、元 Annotation(Meta Annotation)

   JDK除了在java.lang下提供了4個基本的Annotation之外,還在java.lang.annotation包下提供了4個元 Annotation,這4個元Annotation都用于修飾其他的Annotation定義。

1、@Retention(保留)

   @Retention隻能用于修飾一個Annotation定義,用于指定被修飾的Annotation可以保留多長時間,@Retention包含一個RetentionPolicy類型的value成員變量,是以使用@Retention時必須為該value成員變量指定值。

   value成員變量的值都是枚舉常量,隻能是如下3個:

RetentionPolicy.CLASS:編譯器将把Annotation記錄在class檔案中。當運作Java程式時,JVM不再保留Annotation。(預設值)

RetentionPolicy.RUNTIME:編譯器将把Annotation記錄在calss檔案中。當運作Java程式時,JVM也會保留Annotation,程式可以通過反射擷取該Annotation資訊。

RetentionPolicy.SOURCE:Annotation隻保留在源代碼中,編譯器直接丢棄這種Annotation。

2、@Target(對象,目标)

   @Target也隻能修飾一個Annotation定義,它用于指定被修飾的Annotation能用于修飾哪些程式單元。@Target元Annotation也包含一個名為value的成員變量,該成員變量的值

   隻能是如下幾個:

ElementType.ANNOTATION_TYPE:注釋類型聲明

ElementType.CONSTRUCTOR:構造方法聲明

ElementType.FIELD:字段聲明(包括枚舉常量)

ElementType.LOCAL_VARIABLE:局部變量聲明

ElementType.METHOD:方法聲明

ElementType.PACKAGE:包聲明

ElementType.PARAMETER:參數聲明

ElementType.TYPE:類、接口(包括注釋類型)或枚舉聲明

3、@Documented(備有證明檔案的)

   被該元Annotation修飾的Annotation類将可以被javadoc工具提取成文檔,進而成為API文檔中的一部分。

4、@Inherited(通過繼承得到的)

   被@Inherited 元 Annotation修飾的Annotation将具有繼承性,如某個類使用了@NoName Annotation(該Annotation被@Inherited修飾)修飾,則其子類将自動被@NoName修飾。

四、自定義Annotation,及提取Annotation資訊

如下:

   它預設是的RetentionPolicy.CLASS,要使用反射提取資訊時,必須設定其為RUMTIME。當無@Target修飾時,它該Annotation可以在程式的任何地方使用該Annotation。

例子:

五、自定義Annotation,帶成員變量

   根據Annotation是否可以包含成員變量,可以把Annotation分為如下兩類。

标記Annotation:一個沒有定義成員變量的Annotation類型被稱為标記。這種Annotation利用自身的存在與否來為我們提供資訊,如前面介紹的@Override、@Test等Annotation。

中繼資料Annotation:包含成員變量的Annotation,因為它們可以接受更多的中繼資料,是以也被稱為中繼資料Annotation

示例一:

示例二:

六、附注解的應用結構圖

黑馬程式員_Jav基礎加強之注解(annotation)

繼續閱讀