gpt4 book ai didi

Java 注解反射排序

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:32 25 4
gpt4 key购买 nike

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

最佳答案

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

JLS §9.7.5. Multiple Annotations of the Same Type :

The implicitly declared annotation is called the container annotation, and the multiple annotations of type T which appeared in the context are called the base annotations. The elements of the (array-typed) value element of the container annotation are all the base annotations in the left-to-right order in which they appeared in the context.

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

此外, AnnotatedElement 的文档指定:

For an invocation of get[Declared]AnnotationsByType( Class < T >), the order of annotations which are directly or indirectly present on an element E is computed as if indirectly present annotations on E are directly present on E in place of their container annotation, in the order in which they appear in the value element of the container annotation.

将这两个放在一起,意味着像@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 :

If annotations of the annotation type annotationClass are found to be both directly and indirectly present, then getDeclaredAnnotations() will get called to determine the order of the elements in the returned array.

此实现说明是整个文档中的第一个指示符 getDeclaredAnnotations()有可靠的订单。它用于确定履行上述契约(Contract)所需的订单。

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

这是从 Java 8 文档派生的,但是由于 Java 6 和 7 现在已经结束并且不会改变,因此观察到的它们实现的行为至少与保证的行为相匹配对于 Java 8,可能足以依赖它。

关于Java 注解反射排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28067074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com