天天看點

java自定義注解

Java注解是附加在代碼中的一些元資訊,用于一些工具在編譯、運作時進行解析和使用,起到說明、配置的功能。

注解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。

1、元注解

元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四種。

1.1、@Retention: 定義注解的保留政策

@Retention(RetentionPolicy.SOURCE)   //注解僅存在于源碼中,在class位元組碼檔案中不包含

@Retention(RetentionPolicy.CLASS)     // 預設的保留政策,注解會在class位元組碼檔案中存在,但運作時無法獲得,

@Retention(RetentionPolicy.RUNTIME)  // 注解會在class位元組碼檔案中存在,在運作時可以通過反射擷取到

1.2、@Target:定義注解的作用目标

其定義的源碼為:

java自定義注解
java自定義注解

@Target(ElementType.TYPE)   //接口、類、枚舉、注解

@Target(ElementType.FIELD) //字段、枚舉的常量

@Target(ElementType.METHOD) //方法

@Target(ElementType.PARAMETER) //方法參數

@Target(ElementType.CONSTRUCTOR)  //構造函數

@Target(ElementType.LOCAL_VARIABLE)//局部變量

@Target(ElementType.ANNOTATION_TYPE)//注解

@Target(ElementType.PACKAGE) ///包

 由以上的源碼可以知道,他的elementType 可以有多個,一個注解可以為類的,方法的,字段的等等

1.3、@Document:說明該注解将被包含在javadoc中

1.4、@Inherited:說明子類可以繼承父類中的該注解

2、java 注解的自定義

      下面是自定義注解的一個例子

java自定義注解
java自定義注解
java自定義注解
java自定義注解

@Retention(RetentionPolicy.RUNTIME)

定義的這個注解是注解會在class位元組碼檔案中存在,在運作時可以通過反射擷取到。

@Target({ElementType.TYPE,ElementType.METHOD})

是以這個注解可以是類注解,也可以是方法的注解

這樣一個注解就自定義好了,當然注解裡面的成員可以為基本的資料類型,也可以為資料,Object等等

3 注解是定義好了,那麼怎麼來得到,解析注解呢?

java的反射機制可以幫助,得到注解,代碼如下:

java自定義注解
java自定義注解

前一個方法是解析得到方法注解的,後一個方法是得到類注解的

以下是測試方法類

java自定義注解
java自定義注解
java自定義注解
java自定義注解

javascript:void(0)

1、Annotation的工作原理:

JDK5.0中提供了注解的功能,允許開發者定義和使用自己的注解類型。該功能由一個定義注解類型的文法和描述一個注解聲明的文法,讀取注解的API,一個使用注解修飾的class檔案和一個注解處理工具組成。

Annotation并不直接影響代碼的語義,但是他可以被看做是程式的工具或者類庫。它會反過來對正在運作的程式語義有所影響。

Annotation可以沖源檔案、class檔案或者在運作時通過反射機制多種方式被讀取。

2、@Override注解:

表示一個方法聲明打算重寫超類中的另一個方法聲明。如果方法利用此注釋類型進行注解但沒有重寫超類方法,則編譯器會生成一條錯誤消息。

@Override注解表示子類要重寫父類的對應方法。

Override是一個Marker annotation,用于辨別的Annotation,Annotation名稱本身表示了要給工具程式的資訊。

下面是一個使用@Override注解的例子:

3、@Deprecated注解:

用 @Deprecated 注釋的程式元素,不鼓勵程式員使用這樣的元素,通常是因為它很危險或存在更好的選擇。在使用不被贊成的程式元素或在不被贊成的代碼中執行重寫時,編譯器會發出警告。

@Deprecated注解表示方法是不被建議使用的。

Deprecated是一個Marker annotation。

下面是一個使用@Deprecated注解的例子:

4、@SuppressWarnings注解:

訓示應該在注釋元素(以及包含在該注釋元素中的所有程式元素)中取消顯示指定的編譯器警告。注意,在給定元素中取消顯示的警告集是所有包含元素中取消顯示的警告的超集。例如,如果注釋一個類來取消顯示某個警告,同時注釋一個方法來取消顯示另一個警告,那麼将在此方法中同時取消顯示這兩個警告。

根據風格不同,程式員應該始終在最裡層的嵌套元素上使用此注釋,在那裡使用才有效。如果要在特定的方法中取消顯示某個警告,則應該注釋該方法而不是注釋它的類。

@SuppressWarnings注解表示抑制警告。

下面是一個使用@SuppressWarnings注解的例子:

5、自定義注解:

使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程式自動完成其他細節。在定義注解時,不能繼承其他的注解或接口。

自定義最簡單的注解:

使用自定義注解:

5.1、添加變量:

當注解中使用的屬性名為value時,對其指派時可以不指定屬性的名稱而直接寫上屬性值接口;除了value意外的變量名都需要使用name=value的方式指派。

5.2、添加預設值:

5.3、多變量使用枚舉:

5.4、數組變量:

6、設定注解的作用範圍:

訓示注釋類型的注釋要保留多久。如果注釋類型聲明中不存在 Retention 注釋,則保留政策預設為 RetentionPolicy.CLASS。

隻有元注釋類型直接用于注釋時,Target 元注釋才有效。如果元注釋類型用作另一種注釋類型的成員,則無效。

注釋保留政策。此枚舉類型的常量描述保留注釋的不同政策。它們與 Retention 元注釋類型一起使用,以指定保留多長的注釋。

@Retention注解可以在定義注解時為編譯程式提供注解的保留政策。

屬于CLASS保留政策的注解有@SuppressWarnings,該注解資訊不會存儲于.class檔案。

6.1、在自定義注解中的使用例子:

7、使用反射讀取RUNTIME保留政策的Annotation資訊的例子:

表示目前正在此 VM 中運作的程式的一個已注釋元素。該接口允許反射性地讀取注釋。由此接口中的方法傳回的所有注釋都是不可變并且可序列化的。調用者可以修改已指派數組枚舉成員的通路器傳回的數組;這不會對其他調用者傳回的數組産生任何影響。

如果此接口中的方法傳回的注釋(直接或間接地)包含一個已指派的 Class 成員,該成員引用了一個在此 VM 中不可通路的類,則試圖通過在傳回的注釋上調用相關的類傳回的方法來讀取該類,将導緻一個 TypeNotPresentException。

如果指定類型的注釋存在于此元素上,則傳回 true,否則傳回 false。此方法主要是為了便于通路标記注釋而設計的。

參數:

annotationClass – 對應于注釋類型的 Class 對象

傳回:

如果指定注釋類型的注釋存在于此對象上,則傳回 true,否則傳回 false

抛出:

NullPointerException – 如果給定的注釋類為 null

從以下版本開始:

1.5

如果存在該元素的指定類型的注釋,則傳回這些注釋,否則傳回 null。

如果該元素的指定注釋類型的注釋存在于此對象上,則傳回這些注釋,否則傳回 null

傳回此元素上存在的所有注釋。(如果此元素沒有注釋,則傳回長度為零的數組。)該方法的調用者可以随意修改傳回的數組;這不會對其他調用者傳回的數組産生任何影響。

此元素上存在的所有注釋

傳回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法将忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則傳回長度為零的一個數組。)該方法的調用者可以随意修改傳回的數組;這不會對其他調用者傳回的數組産生任何影響。

直接存在于此元素上的所有注釋

下面是使用反射讀取RUNTIME保留政策的Annotation資訊的例子:

自定義注解:

讀取注解中的資訊:

8、限定注解的使用:

限定注解使用@Target。

訓示注釋類型所适用的程式元素的種類。如果注釋類型聲明中不存在 Target 元注釋,則聲明的類型可以用在任一程式元素上。如果存在這樣的元注釋,則編譯器強制實施指定的使用限制。 例如,此元注釋訓示該聲明類型是其自身,即元注釋類型。它隻能用在注釋類型聲明上:

此元注釋訓示該聲明類型隻可作為複雜注釋類型聲明中的成員類型使用。它不能直接用于注釋:

這是一個編譯時錯誤,它表明一個 ElementType 常量在 Target 注釋中出現了不隻一次。例如,以下元注釋是非法的:

程式元素類型。此枚舉類型的常量提供了 Java 程式中聲明的元素的簡單分類。

這些常量與 Target 元注釋類型一起使用,以指定在什麼情況下使用注釋類型是合法的。

注解的使用限定的例子:

9、在幫助文檔中加入注解:

要想在制作JavaDoc檔案的同時将注解資訊加入到API檔案中,可以使用java.lang.annotation.Documented。

在自定義注解中聲明建構注解文檔:

10、在注解中使用繼承:

預設情況下注解并不會被繼承到子類中,可以在自定義注解時加上java.lang.annotation.Inherited注解聲明使用繼承。

訓示注釋類型被自動繼承。如果在注釋類型聲明中存在 Inherited 元注釋,并且使用者在某一類聲明中查詢該注釋類型,同時該類聲明中沒有此類型的注釋,則将在該類的超類中自動查詢該注釋類型。此過程會重複進行,直到找到此類型的注釋或到達了該類層次結構的頂層 (Object) 為止。如果沒有超類具有該類型的注釋,則查詢将訓示目前類沒有這樣的注釋。

注意,如果使用注釋類型注釋類以外的任何事物,此元注釋類型都是無效的。還要注意,此元注釋僅促成從超類繼承注釋;對已實作接口的注釋無效。

除了文章中有特别說明,均為IT宅原創文章,轉載請以連結形式注明出處。

本文連結:http://www.itzhai.com/java-based-notebook-annotation-annotation-introduction-and-use-custom-annotations.html

發表在Java程式設計

| 标簽有@interface、@Override、@Retention、@RetentionPolicy.Runtime、Annotation、Class、Java、Method、元注解、反射、自定義注解

| 發表回複