首頁 > Java > java教程 > 主體

詳解Java Annotation特性的掌握

黄舟
發布: 2017-03-30 10:51:46
原創
1236 人瀏覽過

什麼是Annotation?

Annotation翻譯為中文即為註解,意思就是提供除了程式本身邏輯外的額外的資料資訊。 Annotation對於標註的程式碼沒有直接的影響,它不可以直接與標註的程式碼產生交互,但其他元件可以使用這些資訊。

Annotation資訊可以被編譯進class文件,也可以保留在Java 虛擬機器中,以便在執行時可以取得。甚至對於Annotation本身也可以加Annotation。

那些物件可以加Annotation

類,方法,變數,參數,套件都可以加Annotation。

內建的Annotation

@Override 重載父類別中方法@Deprecated 被標註的方法或型別已不再推薦使用

@SuppressWarnings阻止編譯時的警告訊息。其需要接收一個String陣列作為參數。 可供使用的參數有:

  • unchecked

  • #path

  • ##serial

  • finally

  • fallthrough

#可以用與其他annotation上的annotation

#@Retention

確定Annotation被儲存的

生命週期, 需要接收一個Enum物件RetentionPolicy作為參數。

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}
登入後複製

@Documented 文檔化

#@Target

表示該Annotation可以修飾的範圍,接收一個Enum物件EnumType的數組作為參數。

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}
登入後複製

@Inherited

該Annotation可以影響到被標註的類別的子類別。

自訂Annotation

JSE5.0以後我們可以自訂Annotation。下面就是一個簡單的例子。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {

}
登入後複製

下面的Person物件使用了自訂的MethodAnnotation。

public class Person {

    public void eat() {
        System.out.println("eating");
    }

    @MethodAnnotation
    public void walk() {
        System.out.print("walking");
    }

}
登入後複製

我們可以透過反射來獲取Annotation的資訊。

 Class<Person> personClass = Person.class;
        Method[] methods = personClass.getMethods();
        for(Method method : methods){
            if (method.isAnnotationPresent(MethodAnnotation.class)){
                method.invoke(personClass.newInstance());
            }
        }
登入後複製

輸出:

walking
登入後複製

我們也可以為自訂的Annotation加上方法。

@Target(ElementType.TYPE)
public @interface personAnnotation {
    int id() default 1;
    String name() default "bowen";
}
登入後複製

以下是personAnnotation的使用。

@personAnnotation(id = 8, name = "john")
public class Person {

    public void eat() {
        System.out.println("eating");
    }

    @MethodAnnotation
    public void walk() {
        System.out.print("walking");
    }

}
登入後複製

Annotation是如何被處理的

當Java原始碼被編譯時,編譯器的一個插件annotation處理器則會處理這些annotation。處理器可以產生報告訊息,或建立附加的Java來源檔案或資源。如果annotation本身被加上了RententionPolicy的運行時類,則Java編譯器則會將annotation的元資料儲存到class檔案中。然後,Java虛擬機器或其他的程式可以尋找這些元資料並做相應的處理。

當然除了annotation處理器可以處理annotation外,我們也可以用反射自己來處理annotation。 Java SE 5有一個名為AnnotatedElement的

介面,Java的反射物件類別Class,Constructor,Field,Method以及Package都實作了這個介面。這個介面用來表示目前在Java虛擬機器中運作的被加上了annotation的程式元素。透過這個介面可以使用反射讀取annotation。 AnnotatedElement介面可以存取被加上RUNTIME標記的annotation,對應的方法有getAnnotation,getAnnotations,isAnnotationPresent。由於Annotation類型被編譯和儲存在二進位檔案中就像class一樣,所以可以像查詢普通的Java物件一樣查詢這些方法傳回的Annotation。

Annotation的廣泛使用

Annotation被廣泛用於各種

框架和函式庫中,下面就列舉一些典型的應用.

Junit

Junit是非常著名的

單元測試框架,使用Junit的時候需要接觸大量的annotation。

  • @Runwith 自訂測試類別的Runner

  • #@ContextConfiguration 設定Spring的ApplicationContext

  • # @DirtiesContext 當執行下一個測試前重新載入ApplicationContext.

  • #@Before 呼叫測試方法前初始化

  • ##@After 呼叫測試方法後處理
  • @Test 表示方法是測試方法
  • #@Ignore 可以加在測試類別或測試方法上,忽略運行。
  • @BeforeClass:在該測試類別中的所有測試方法執行前調用,只被調用一次(被標註的方法必須是
  • static

  • @AfterClass:在該測試類別中的所有的測試方法執行完後調用,只被執行一次(被標註的方法必須是static)

Spring

Spring 號稱配置地獄,Annotation也不少。

  • @Service 給service類別加註解

  • #@Repository 給DAO類別加註解

  • # @Component 給元件類別加註解

  • @Autowired 讓Spring自動組裝bean

  • @Transactional 設定事物

  • @Scope 設定物件存活範圍

  • @Controller 為控制器類別加註解

  • @RequestMapping url路徑對應

  • ##@PathVariable 將方法參數對應到路徑

  • #@RequestParam 將請求參數綁定到方法變數

  • @ModelAttribute 與model綁定

@SessionAttributes 設定到session屬性

  • Hibernate

  • ## @Entity 修飾entity bean

  • @Table 將entity類別與資料庫中的table映射起來

@Column 對應列

#@Id 映射id

@GeneratedValue 此欄位是自增長的
  • @Version 版本控製或併發性控制

    @OrderBy 排序規則
  • #@Lob 大物件標註
  • Hibernate還有大量的關於聯合的annotation和
  • 繼承
  • 的annotation,這裡就不意義列舉了。

    JSR 303 – Bean Validation
  • JSR 303 – Bean Validation是一個資料驗證的規範,其對Java bean的驗證主要透過Java annotation來實現。

  • @

    Null

  • 註解
  • 的元素必須為null

  • @NotNull被註解的元素必須不為null

  • @AssertTrue被註解的元素必須為true@AssertFalse被註解的元素必須為false@Min(value)被註解的元素必須是一個數字,其值必須大於等於指定的最小值

  • @Max(value)被註解的元素必須是一個數字,其值必須小於等於指定的最大值

  • #@DecimalMin(value)被註解的元素必須是一個數字,其值必須大於等於指定的最小值

    @DecimalMax(value)被註解的元素必須是一個數字,其值必須小於等於指定的最大值

@Size(max, min)被註解的元素的大小必須在指定的範圍內###### ######@Digits (integer, fraction)被註解的元素必須是一個數字,其值必須在可接受的範圍內############@Past被註解的元素必須是一個過去的日期############@Future被註解的元素必須是一個將來的日期###########@Pattern(value)被註解的元素必須符合指定的###正規表示式###############其實還有很多使用了annotaion的framework或library,這裡就不一一列舉了,希望大家能舉一反三,深入了解Java中的annotation。 ###

以上是詳解Java Annotation特性的掌握的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板