Java學習之註解Annotation

來源:互聯網
上載者:User

標籤:doc   out   system   lang   反射   void   image   成員變數   預設值   

一、 什麼是註解(Annotation)?

 1. 概念:

  Annotation是代碼裡的特殊標記,這些標記可以在編譯、類載入、運行時被讀取,並執行相應的處理。通過使用注釋,程式開發人員可以可以在不改變原有邏輯的情況下,在源檔案中嵌入一些補充的資訊。

    2. 作用:

  1)不是程式本身,可以對程式做出解釋

  2)可以被其他程式讀取

     3. 格式

       註解是以“@注釋名”在代碼中存在的,還可以添加一些參數值,例如:@SuppressWarnings(value="unchecked");

     4. Annotation在哪裡使用?

       可用於包、類、構造器、方法、成員變數、參數、局部變數的聲明,相當於給它們添加額外的資訊,我們可以通過反射機制編程實現對中繼資料的訪問

二、基本Annotation,5個基本Annotation都在java.lang包下

  1) @Override :此注釋只適用於修飾方法,表示一個方法聲明打算重寫超類中另一個方法的聲明;

  2) @Deprecated: 用於表示某個程式元素(類、方法等)已淘汰,當其他程式使用已淘汰的類、方法時,編譯器將會給出警告。表示不鼓勵程式員使用給類、方法。

  3) @SuppressWarnings:指示被該Annotation修飾的程式元素(要以及該程式元素的所有子項目)取消顯示指定的編譯器警告。抑制編譯時間的警告資訊。與前兩個注釋有所不同,需要添加一個參數才能正確使用,這些參數已經定義好了,我們選擇就可以,參數如下:

        

  4) @SafeVarargs:Java7中的“堆汙染”,修飾引發給警告的方法或構造器,類抑制“堆汙染”警告;

    堆汙染:當把一個不帶泛型的對象賦給一個帶泛型的得變數時,往往會發生這種“堆汙染”

       5) @FunctionallInterface:Java8中規定,如果介面中只有一個抽象方法,該介面就是函數式介面。@FunctionallInterface就是用來指定某個介面必須是函數式介面。

三、自訂Annotation

  1. @interface用來聲明一個註解 

           格式為:public @interface 註解名 {定義體}

   2. 其中每一個方法實際上是聲明了一個配置參數

           1)方法名稱就是參數名稱

           2)傳回值類型就是參數的類型(傳回值類型只能是基本類型、String、Class、enum)

      3)可以通過default來聲明參數的預設值(預設值為-1時,表示該參數不存在)

   4)如果只有一個參數成員,一般參數名為value   

@Retention(value=RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD,ElementType.TYPE})public @interface MyAnnotation {    String name() default " ";    int age() default 0;    int id() default -1; //不存在}

 

         3. JDK的元註解:用於修飾其他的Annotation定義。作用:負責註解其他註解

   1)@Retention:用於指定被修飾的Annotation可以保留多長時間,@Retention包含了一個RetentionPolicy類型的value參數配置,所以使用@Retention時必須為該value參數指定值;

    

    [email protected](RetentionPolicy.SOURCE):將被編譯器直接丟棄

   2)@Target:用於指定被修飾的Annotation能用於修飾哪些程式單元,也就是註解的適用範圍;@Target包含了一個ElementType類型的value參數配置,所以使用@Target時必須為該value參數指定值;

    

    [email protected](ElementType.FIELD):只能修飾成員變數

   3)@Documented:用於指定被該元Annotation修飾的Annotation類將被javadoc工具提取成文檔,如果定義Annotation類時使用了@Documentedx修飾,則所有使用該Annotation修飾的程式元素的API文檔中將會包含該Annotation說明;

   4)@Inherited:指定被它修飾的Annotation將具有繼承性---如果某個類使用了@Xxx註解(定義該註解時使用了@Inherited修飾)修飾,則其子類將自動被@Xxx修飾。

  4. 使用反射讀取註解的資訊:使用註解完成類和表結構的映射關係

    

   1)表名的註解    

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyTable {    String value();}

 

   2)屬性的註解

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface MyField {    String columnName();    String type();    int length();}

   3)使用反射讀取註解

 1 public class Demo03 { 2     public static void main(String[] args) { 3         try { 4                 Class clzz = Class.forName("com.java.annotation.MyStudent"); 5                 //擷取該類所有的註解 6                 Annotation[] annotations = clzz.getAnnotations(); 7                 for(Annotation a :annotations) { 8                     System.out.println(a); 9                 }10                 //擷取該類指定的註解11                 MyTable mb = (MyTable) clzz.getAnnotation(MyTable.class);12                 System.out.println(mb.value());13                 14                 //擷取類的屬性的註解15                 Field f = clzz.getDeclaredField("id");16                 MyField myfield = f.getAnnotation(MyField.class);17                 System.out.println(myfield.columnName()+"---"+myfield.type()+"---"+myfield.length());18                 19             } catch (Exception e) {20             e.printStackTrace();21         }22     }23 }

 

Java學習之註解Annotation

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.