在维护对 Java 7 的支持时使用 @Repeatable

Using @Repeatable while mainaining support for Java 7

Java 8 通过使用 "container" 注释支持可重复注释:

@Repeatable(FooContainer.class)
@interface Foo {
    String value();
}
@interface FooContainer {
    Foo[] value();
}

@Foo("bar")
@Foo("baz")
public class SomeClass { }

我有一个库,我想在其中支持 Java 7(或更新版本)。这个库广泛使用注释,并且会从支持可重复注释中受益匪浅。

据我了解,容器注释甚至在 Java 7 中也有效,只有一个人不得不使用它:

@FooContainer({@Foo("bar"),@Foo("baz")})
public class SomeClass { }

我最终想要的是:如果我的图书馆的用户正在使用 Java8,用户将能够使用重复注释。如果用户使用Java7,他必须坚持手动编写容器注解。

这样的事情有可能吗?

您需要提供两个版本的库:

  • 一个旨在与 Java 8 一起使用,它对定义进行元注释 Foo@Repeatable.
  • 一个旨在与 Java 7 一起使用,它明确定义了 FooFooContainer.

遗憾的是,您的一个版本的库不能同时支持 Java7 和重复注释。如果您希望客户端能够重复注释,那么 Foo 必须被元注释为 @Repeatablejava.lang.annotation.Repeatable只在Java8中定义。因此,如果注释Foo被元注释为@Repeatable,则FooSomeClass都只能在 JDK 8 及更高版本上进行编译和 运行。 (它只能是 运行 on JDK 8 因为当加载 SomeClass 时,将加载 Foo,并且将加载 Foo 上的任何元注释。)