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

自定義註解開發java

  1.開發一個註解類數組

    開發一個註解類的過程,很是相似於開發一個接口,只不過須要經過@interface關鍵字來聲明工具

  2.使用元註解修飾註解的聲明spa

    所謂的原註解是用來修飾註解聲明的註釋,能夠控制被修飾的註解的特性。code

    @Targetblog

      用來聲明被修飾的註解能夠用在什麼位置。繼承

      能夠在@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 }
相關文章
相關標籤/搜索