JAVA-註解(2)-自定義註解及反射註解

Mr丶L發表於2019-07-26

自定義註解開發

  1.開發一個註解類

    開發一個註解類的過程,非常類似於開發一個介面,只不過需要通過@interface關鍵字來宣告

  2.使用元註解修飾註解的宣告

    所謂的原註解是用來修飾註解宣告的註釋,可以控制被修飾的註解的特性。

    @Target

      用來宣告被修飾的註解可以用在什麼位置。

      可以在@Target的屬性中設定Element Type型別的陣列來指定可以使用的位置。

      如果不使用此原註解修飾,預設註解可以用在任意位置。

    @Retention

      用來宣告被修飾的註釋會被保留到什麼階段。

      可以在該註解的屬性中通過RetentionPolicy型別的值來指定註釋被保留到何時。

        (1)RetentionPolicy.SOURCE

            此註解將會被保留到原始碼階段,java中,在編譯過程中被刪除。

            這種型別的註解通常是給編譯器看的。

        (2)Retention Policy.CLASS

            此註解將會被保留到原始碼階段和編譯階段,.java和.class中,在類載入的過程中被刪除。

            這種型別的註解通常是給類載入器看的。

        (3)RetentionPolicy.RUNTIME

            此註解將會被保留在原始碼階段、編譯階段和執行階段,.java  .class和記憶體中的位元組碼中都會存在。

            這種型別的註解通常在執行階段進行反射,控制程式執行過程。

         ***只有RUNTIME級別的註解才可以通過反射技術進行反射。

    @Documented

        用來宣告被修飾註解是否要被文件提取工具提取到文件中。

        預設不提取

    @Inherited

        被修飾的註釋是否具有繼承性

        預設沒有繼承性

  3.為註解增加屬性

    註解類中還可以有宣告屬性。

    為註解類宣告屬性的過程非常類似於介面定義方法。

    但要求,註解中的所有的屬性必須是public的,可以顯式宣告,也可以不宣告,不宣告預設就是public的。

    註解中的屬性只能是八種基本資料型別、String型別、Class型別、其他註解型別及以上型別的一維陣列。

    註解中宣告的屬性 需要在使用註解時,為其賦值,賦值的方式就是在使用註解時,在註解後跟上一對小括號,在括號中通過  屬性名=屬性值   的方式指定屬性的值

    也可以在宣告註解時,在註解的屬性後面通過default關鍵字,宣告屬性的預設值,這樣一來,使用註解時不賦值,將會使用default預設值,當然也可以手動賦值,覆蓋預設值。

    如果屬性是一維陣列型別,在傳入的陣列中,只有一個值,則包括陣列的大括號也可以省略。

    如果註解的屬性只有一個需要賦值,且該屬性的名稱叫做value,則在使用註解時,value==可以不寫

反射註解

  1.反射註解的原理

    RetentionPolicy.RUNTIME級別的註解會保留到執行中,可以通過反射技術獲取,從而可以根據是否有註解 或 註解屬性值的不同來控制程式按照不同方式執行。

    以下反射相關的型別中都提供了反射註解的方法:

      類Class<T>、類Method、類FIeld、類Constructor<T>、類Package

    

  2.反射註解案例

 1 package cn.tedu.test;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 @Target(ElementType.TYPE)
 9 @Retention(RetentionPolicy.RUNTIME)
10 @interface level{
11     String value();
12 }
13 
14 @level("刑警")
15 class Police{
16 }
17 
18 public class AnnoTest02 {
19     public static void main(String[] args) {
20         System.out.println("敬了個禮,您好,您超速了,罰款200元。。。");
21         if(Police.class.isAnnotationPresent(level.class)){
22             level anno = Police.class.getAnnotation(level.class);
23             if("協警".equals(anno.value())){
24                 System.out.println("哥們少罰點,50塊得了~~");
25             }else if("交警".equals(anno.value())){
26                 System.out.println("哥們抽根菸,這是200塊,收好我走人~~");
27             }else if("刑警".equals(anno.value())){
28                 System.out.println("趕緊交錢走人,別查出 別的事。。。");
29             }else{
30                 System.out.println("xxx");
31             }
32         }else{
33             System.out.println("打一頓,扭送警察局。。");
34         }
35     }
36 }

 

相關文章