定義註釋型別

註釋型別使用 @interface 定義。定義引數類似於常規介面的方法。

@interface MyAnnotation {
    String param1();
    boolean param2();
    int[] param3();  // array parameter 
}

預設值

@interface MyAnnotation {
    String param1() default "someValue";
    boolean param2() default true;
    int[] param3() default {};
}

元註釋

元註釋是可以應用於註釋型別的註釋。特殊的預定義元註釋定義瞭如何使用註釋型別。

@目標

@Target 元註釋限制了註釋可以應用的型別。

@Target(ElementType.METHOD)
@interface MyAnnotation {
    // this annotation can only be applied to methods
}

可以使用陣列表示法新增多個值,例如 @Target({ElementType.FIELD, ElementType.TYPE})

可用值

Version => Java SE 8

@保留

@Retention 元註釋定義了應用程式編譯過程或執行期間的註釋可見性。預設情況下,註釋包含在 .class 檔案中,但在執行時不可見。要在執行時訪問註釋,必須在該註釋上設定 RetentionPolicy.RUNTIME

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    // this annotation can be accessed with reflections at runtime
}

可用值

RetentionPolicy 影響
註釋在 .class 檔案中可用,但在執行時不可用
執行 註釋在執行時可用,可以通過反射訪問
資源 註釋在編譯時可用,但未新增到 .class 檔案中。註釋可以例如由註釋處理器使用。

@Documented

@Documented 元註釋用於標記註釋,其用法應由 API 文件生成器(如 javadoc)記錄 。它沒有價值。使用 @Documented,所有使用註釋的類都會在生成的文件頁面上列出它。沒有 @Documented,就不可能看到哪些類在文件中使用了註釋。

@遺傳

@Inherited 元註釋與應用於類的註釋相關。它沒有價值。將註釋標記為 @Inherited 會改變註釋查詢的工作方式。

  • 對於非繼承註釋,查詢僅檢查正在檢查的類。
  • 對於繼承的註釋,查詢還將檢查超類鏈(遞迴),直到找到註釋的例項。

請注意,僅查詢超類:將忽略附加到類層次結構中的介面的任何註釋。

@Repeatable

在 Java 8 中新增了 @Repeatable 元註釋。它表示註釋的多個例項可以附加到註釋的目標。這個元註釋沒有價值。