天天看點

深入淺出 java 注解-03-java 元注解 @Retention、@Documented、@Target、@Inherited、@Repeatable目錄元注解@Retention@Documented@Target@Inherited@Repeatable代碼位址系列導航

目錄

  • 目錄
  • 元注解
  • @Retention
    • 執行個體
    • 說明
  • @Documented
    • 執行個體
  • @Target
    • 執行個體
    • 說明
  • @Inherited
    • 執行個體
    • 說明
  • @Repeatable
    • 執行個體
  • 代碼位址
  • 系列導航

元注解

适用于其他注釋的注釋稱為元注釋。在 java.lang.annotation 中定義了幾個元注釋類型。

@Retention

指定标記的注解如何存儲:

屬性 說明
RetentionPolicy.SOURCE 标記的注釋隻保留在源層中,編譯器将忽略它。
RetentionPolicy.CLASS 編譯器在編譯時保留标記的注釋,但是Java虛拟機(JVM)會忽略它。
RetentionPolicy.RUNTIME 标記的注釋由JVM保留,以便運作時環境可以使用它。

執行個體

@Retention(RetentionPolicy.RUNTIME)
public @interface MetadataDemo {
}
           

說明

  • RetentionPolicy.RUNTIME

運作時注解應該是使用最多的。

  • RetentionPolicy.SOURCE

一般用于編譯時注解的定義,比如 lombok 相關的注解。

@Documented

@Documented

注解表明,無論何時使用指定的注釋,都應該使用Javadoc工具對這些元素進行文檔化。

(預設情況下,注釋不包含在Javadoc中。)有關更多資訊,請參見Javadoc工具頁。

執行個體

@Retention(RetentionPolicy.CLASS)
@Documented
public @interface MetadataDemo {
}
           

@Target

@Target批注标記另一個批注,以限制批注可以應用于何種Java元素。目标注釋指定以下元素類型之一作為其值:

屬性 說明
ElementType.ANNOTATION_TYPE 應用于注解類型
ElementType.CONSTRUCTOR 可以應用于構造函數
ElementType.FIELD 可以應用于字段或屬性。
ElementType.LOCAL_VARIABLE 可以應用于一個局部變量
ElementType.METHOD 可以應用于方法級注釋
ElementType.PACKAGE 應用于包聲明
ElementType.PARAMETER 應用于方法的參數
ElementType.TYPE 應用于類的任何元素

執行個體

@Retention(RetentionPolicy.CLASS)
@Documented
@Target(ElementType.METHOD)
public @interface MetadataDemo {
}
           

說明

指定我們注解的應用範圍非常重要。一般最常用的是

ElementType.TYPE

ElementType.METHOD

@Inherited

@Inherited

表明注解類型可以從超類繼承。(這在預設情況下是不對的。)

當使用者查詢注釋類型而該類沒有對此類型的注釋時,将查詢類的超類以擷取注釋類型。此注釋僅應用于類聲明。

執行個體

@Retention(RetentionPolicy.CLASS)
@Documented
@Target(ElementType.METHOD)
@Inherited
public @interface MetadataDemo {
}
           

說明

當一個類繼承了擁有此注解的類時,即使目前類沒有任何注解。

隻要父類的注解擁有(

@Inherited

)屬性,則在子類中可以擷取到此注解。

@Repeatable

在Java SE 8中引入的

@Repeatable

注解表明标記的注解可以多次應用于相同的聲明或類型使用。

有關更多資訊,請參見重複注釋。

執行個體

  • Repeats.java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Repeats {
    Repeat[] value();
}
           
  • Repeat.java
@Repeatable(value = Repeats.class)
public @interface Repeat {
    String value();
}
           
  • RepeatDemo.java
public class RepeatDemo {

    @Repeat(value = "tag")
    @Repeat(value = "tag2")
    public void method() {
    }

}
           

代碼位址

annotation metadata

系列導航

系列導航

繼續閱讀