重複註釋

在 Java 8 之前,相同註釋的兩個例項無法應用於單個元素。標準的解決方法是使用容器註釋,其中包含一些其他註釋的陣列:

// Author.java
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
    String value();
}

// Authors.java
@Retention(RetentionPolicy.RUNTIME)
public @interface Authors {
    Author[] value();
}

// Test.java
@Authors({
    @Author("Mary"),
    @Author("Sam")
})
public class Test {
    public static void main(String[] args) {
        Author[] authors = Test.class.getAnnotation(Authors.class).value();
        for (Author author : authors) {
            System.out.println(author.value());
            // Output:
            // Mary
            // Sam
        }
    }
}

Version >= Java SE 8

Java 8 使用 @Repeatable 註釋提供了一種更清晰,更透明的使用容器註釋的方法。首先我們將它新增到 Author 類:

@Repeatable(Authors.class)

這告訴 Java 將多個 @Author 註釋視為被 @Authors 容器包圍。我們也可以使用 Class.getAnnotationsByType() 通過它自己的類來訪問 @Author 陣列,而不是通過它的容器:

@Author("Mary")
@Author("Sam")
public class Test {
    public static void main(String[] args) {
        Author[] authors = Test.class.getAnnotationsByType(Author.class);
        for (Author author : authors) {
            System.out.println(author.value());
            // Output:
            // Mary
            // Sam
        }
    }
}