定義註釋型別
註釋型別使用 @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
元註釋。它表示註釋的多個例項可以附加到註釋的目標。這個元註釋沒有價值。