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

标签 java annotations java-8 javac

Java 8 通过使用“容器”注解来支持可重复注解:

@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 { }

我最终想要的是:如果我的库的用户使用的是 Java 8,则用户将能够使用重复注释。如果用户使用的是 Java 7,他必须坚持手动编写容器注解。

这样的事情有可能吗?

最佳答案

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

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

不幸的是,您的一个版本的库不能同时支持 Java 7 和重复注解。如果您希望客户端能够重复注释,则 Foo 必须元注释为 @Repeatablejava.lang.annotation.Repeatable 仅在 Java 8 中定义。因此,如果注释 Foo 被元注释为 @Repeatable,两者 FooSomeClass只能在JDK 8及以上编译运行。 (它只能在 JDK 8 上运行,因为当加载 SomeClass 时,将加载 Foo,并且将加载 Foo 上的任何元注释。)

关于java - 在维护对 Java 7 的支持的同时使用@Repeatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29542534/

相关文章:

java - SQL WHERE 中的多个条件 AND

java - 我想将 computeIfPresent 和 putIfAbsent 都放到一个原子函数中

java - 如何使用 spring rabbitmq 在不同队列中配置超时、重试或最大尝试

java - 如何在Spring注释配置中指定bean的父级?

java - 如何检测交易类型: JTA or Resource Local from java code?

java - 观察数据库中的@Relation 变化

java - 自定义注释作为 JUnit 中的列表注入(inject)

java - 如何使用流外的值创建带有 Java 流 API 的 map ?

java - Int 流和收集

java - 如何包含文件中的类路径?