这确实有点低估了。让我们从 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,依赖它可能就足够了。