这确实有点不足。让我们从可重复批注的Java 8功能入手,因为它有一些地方:
JLS第9.7.5节。相同类型的多个注释:
隐式声明的注释称为 容器注释 ,而出
T现在上下文中的多个类型的 注释 称为 基础注释
。value容器批注的(数组类型)元素的元素都是在上下文中出现的从左到右顺序的所有基本批注。
因此,容器将按顺序提供重复的注释。
此外,的文档
AnnotatedElement指定:
对于的调用
get[Declared]AnnotationsByType( Class < T >),计算直接或间接存在于元素 E
上的批注的顺序,就好像间接存在于 E 上的批注代替它们的容器批注直接出现在 E 上一样,按照它们在值中出现的顺序容器注释的元素。
将这两者放在一起,就意味着重复的注释之类
@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)?
有趣的是,如何实现的:
如果发现注释类型的注释类型直接或间接存在,
getDeclaredAnnotations()则将被调用以确定返回数组中元素的顺序。
该实施说明是整个文档中
getDeclaredAnnotations()顺序可靠的第一个指标。它用于确定履行上述合同所需的订单。
因此,答案是肯定的,
getDeclaredAnnotations()以有保证的顺序提供注释,但是该信息未直接附加到方法本身的文档中。
这是从Java 8文档衍生而来的,但是由于Java 6和7现在已经寿终正寝,并且不会更改,因此,观察到的其实现的行为与至少为Java
8保证的行为相匹配的事实。 ,可能足以依靠它。



