Java的註解(Annotation)相關內容

從 JDK 5.0 開始, Java 增加了對元數據(MetaData) 的支持, 也就是 Annotation(註解) 。

Annotation 其實就是代碼裏的特殊標記, 這些標記可以在編譯, 類加 載, 運行時被讀取, 並執行相應的處理。通過使用Annotation, 程序員 可以在不改變原有邏輯的情況下, 在源文件中嵌入一些補充信息。代 碼分析工具、開發工具和部署工具可以通過這些補充信息進行驗證 或者進行部署。

 Annotation 可以像修飾符一樣被使用, 可用於修飾包,類, 構造器, 方 法, 成員變量, 參數, 局部變量的聲明, 這些信息被保存在Annotation 的 “name=value” 對中。

在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/Android中註解佔據了更重要的角色,例如用來配置應用程序的任何切面,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等。 

未來的開發模式都是基於註解的,JPA是基於註解的,Spring2.5以 上都是基於註解的,Hibernate3.x以後也是基於註解的,現在的 Struts2有一部分也是基於註解的了,註解是一種趨勢,一定程度上可以說:框架 = 註解 + 反射 + 設計模式。

在編譯時進行格式檢查(JDK內置的三個基本註解)

  • @Override: 限定重寫父類方法, 該註解只能用於方法
  • @Deprecated: 用於表示所修飾的元素(類, 方法等)已過時。通常是因爲
  • 所修飾的結構危險或存在更好的選擇
  • @SuppressWarnings: 抑制編譯器警告

自定義 Annotation (自定義註解必須配上註解的信息處理流程,也就是通過反射獲取註解信息,從而進行相關操作,纔有意義):

  • 定義新的 Annotation 類型使用 @interface 關鍵字 
  • 自定義註解自動繼承了java.lang.annotation.Annotation接口 
  •  Annotation 的成員變量在 Annotation 定義中以無參數方法的形式來聲明。其 方法名和返回值定義了該成員的名字和類型。我們稱爲配置參數。類型只能 是八種基本數據類型、String類型、Class類型、enum類型、Annotation類型、 以上所有類型的數組。 
  • 可以在定義 Annotation 的成員變量時爲其指定初始值, 指定成員變量的初始 值可使用 default 關鍵字。
  • 如果只有一個參數成員,建議使用參數名爲value。
  •  如果定義的註解含有配置參數,那麼使用時必須指定參數值,除非它有默認 值。格式是“參數名 = 參數值”,如果只有一個參數成員,且名稱爲value, 可以省略“value=” 。
  • 沒有成員定義的 Annotation 稱爲標記; 包含成員變量的 Annotation 稱爲元數據 Annotation 

JDK 中的元註解

  • JDK 的元Annotation 用於修飾其他Annotation 定義
  • JDK5.0提供了4個標準的meta-annotation類型,分別是: Retention、Target、Documented、Inherited。

@Retention:

只能用於修飾一個 Annotation 定義, 用於指定該 Annotation 的生命 週期, @Rentention 包含一個 RetentionPolicy 類型的成員變量, 使用 @Rentention 時必須爲該 value 成員變量指定值: 

  • RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),編譯器直接丟棄這種策略的註釋
  • RetentionPolicy.CLASS:在class文件中有效(即class保留) , 當運行 Java 程序時, JVM 不會保留註解。 這是默認值 。
  • RetentionPolicy.RUNTIME:在運行時有效(即運行時保留),當運行 Java 程序時, JVM 會保留註解。程序可以通過反射獲取該註解。

@Target: 

用於修飾 Annotation 定義, 用於指定被修飾的 Annotation 能用於 修飾哪些程序元素。 @Target 也包含一個名爲 value 的成員變量。

@Documented: 用於指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文檔。默認情況下,javadoc是不包括註解的。定義爲Documented的註解必須設置Retention值爲RUNTIME。

@Inherited: 被它修飾的 Annotation 將具有繼承性。如果某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具有該註解。比如:如果把標有@Inherited註解的自定義的註解標註在類級別上,子類則可以 繼承父類類級別的註解。實際應用中,使用較少
@Documented和@Inherited這兩個元註解使用較少。

使用例子:

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {

    String value() default "hello";
}

@MyAnnotation(value="abc")
class Person{
    private String name;
    private int age;

    public Person() {
    }
    @MyAnnotation
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @MyAnnotation
    public void walk(){
        System.out.println("人走路");
    }
    public void eat(){
        System.out.println("人吃飯");
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章