【问题标题】:Java Annotations Reflection OrderingJava 注解反射排序
【发布时间】:2015-01-21 12:18:38
【问题描述】:

当通过反射访问定义在字段上的注释时(即使用getDeclaredAnnotations() : Annotation[] 方法),Java 6 或 7 规范是否对返回注释的顺序做出任何保证。我已经检查了相关的 java 文档,但似乎找不到明确的答案。

【问题讨论】:

  • 我自己也想知道这一点,尤其是使用 java 8 @Repeatable
  • 我也在问自己同样的问题——到目前为止我找不到任何明确的说法。有这方面的消息吗?
  • @Adam Gent, @mkurz:至少对于可重复的注释,规范中有一些明确的词,我已经将它们组合在一起。他们甚至允许对有关 getDeclaredAnnotations() 的原始问题作出结论。

标签: java reflection annotations


【解决方案1】:

这确实有点低估了。让我们从 Java 8 的可重复注释特性开始,因为它有一些细节:

JLS §9.7.5. Multiple Annotations of the Same Type:

隐式声明的注解称为容器注解,而出现在上下文中的多个T类型的注解称为基础注解。容器注解的(数组类型的)value 元素的元素是所有基本注解,按照它们在上下文中出现的从左到右的顺序排列。

所以容器会按顺序提供重复的注解。

另外,AnnotatedElement 的文档说明:

对于get[Declared]AnnotationsByType( Class < T >) 的调用,直接或间接存在于元素E 上的注释的顺序被计算为好像在E 上间接存在的注释是直接存在的出现在 E 上,以代替它们的容器注释,按照它们在容器注释的 value 元素中出现的顺序。

将这两者放在一起,这意味着像@Foo(1) @Foo(2) @Foo(3)这样的重复注释会像你写的@FooContainer({@Foo(1), @Foo(2), @Foo(3)})一样被存储,而后者,不管它最初是如何创建的,都会被getDeclaredAnnotations()处理,就像直接呈现的注释一样那个顺序。

所以重复注释的答案是顺序将是“它们出现的从左到右的顺序”。


但是我们可以从AnnotatedElement 的文档中得出另一个结论。由于它声明注释的顺序是按照间接存在的注释直接存在于它们的容器注释的位置来计算的,这意味着如果您编写@Foo(1) @FooContainer({@Foo(2), @Foo(3)})@FooContainer({@Foo(1), @Foo(2)}) @Foo(3),则顺序将与容器将替换它,就像你写的 @Foo(1) @Foo(2) @Foo(3).

有意思,how that is achieved

如果发现注释类型 annotationClass 的注释直接和间接存在,则将调用 getDeclaredAnnotations() 以确定返回数组中元素的顺序。

本实施说明是整个文档中getDeclaredAnnotations() 具有可靠顺序的第一个指标。它用于确定履行上述合同所需的订单。

所以答案是,是的,getDeclaredAnnotations() 以有保证的顺序提供注释,但该信息并未直接附加到方法本身的文档中。

这源自 Java 8 文档,但由于 Java 6 和 7 现在已经到了生命周期的尽头并且不会改变,因此观察到的实现行为与至少保证的行为相匹配这一事实对于 Java 8,依赖它可能就足够了。

【讨论】:

  • 非常感谢您的精心呈现和全面的回答。
  • 感谢您的详细解答!这是我能找到的第一个声明,它清楚且合乎逻辑地说明了通过 getDeclaredAnnotations() 检索注释的顺序 - 我已经做了相当多的研究......非常感谢!
  • 我不认为你可以依靠一个微妙的提示而不是直接说明方法的合同来保持订单。如果是“有人只是忘记在文档中提及它”的情况,那么这已经是固定的了。在它一成不变之前,如果假设将来它会保持不变,那么编码可能会破坏您基于注释的功能。
  • @mkurz,我做了,还没有回复。话题扯远了,等等。
  • 我与一位 OpenJDK 贡献者进行了交谈,他说正式发布应该没有问题。所以我们将创建一个“规范请求”,它有可能会出现在 JDK.next 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2014-04-03
  • 1970-01-01
  • 2014-02-12
相关资源
最近更新 更多