当前位置: 首页 > 面试题库 >

Java批注反射顺序

林烨烨
2023-03-14
问题内容

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


问题答案:

这确实有点不足。让我们从可重复批注的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保证的行为相匹配的事实。 ,可能足以依靠它。



 类似资料:
  • 本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射(reflection),很多小伙伴即便参与了工作,可能也极少用到 Java 反射机制,但是如果你想要开发一个 web 框架,反射是不可或缺的知识点。本小节我们将了解到 什么是反射,反射的使用场景,不得不提的 Class 类,如何通过反射访问类内部的字段、方法以及构造方法等知识点。 1. 什么是反射 Java 的反射(reflecti

  • 但是,由于某种原因,总是,所以我不确定这是注释类的问题还是我使用反射的方式的问题。我很确定是后者,因为在调试时,我发现它能够访问带有注释的方法。如有任何帮助,不胜感激,谢谢!

  • 问题内容: 我试图使用反射从另一个类中获取方法,但是由于某种原因,它一直在给我提供这样的方法异常。这些是即时通讯使用的类: ScriptTable类: DummyScript类 问题答案: 这是你的问题: 更改为: 并查看此处以了解原因: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod%28java.l

  • 问题内容: 这是一个测试类: 这是我的输出: 我缺少通过反射使注释可见的什么? 我是否仅需要检查它们的存在就需要注释处理器? 问题答案: 为了在运行时访问注释,它需要具有运行时的保留策略。 否则,注释将被丢弃,并且JVM无法识别它们。 有关更多信息,请参见此处。

  • 我在实施辅助注射时遇到了错误。 辅助注射一直有效,直到我引入了另一个名为管理器的类,它依赖于辅助类。经理想要使用代码在构建喷油器图时中断。它没有更进一步。 直觉上,我理解当对象A得到帮助时,那么B(依赖于A)实际上也通过A得到了隐含的帮助。 请注意,我检查过了。我想像ColinD这样的人肯定知道答案如何使用Guice的AssistedInject?如何将辅助注入类绑定到接口? 出于好奇,有没有好的

  • 问题内容: 一般问题:反向流的正确方法是什么?假设我们不知道流包含什么类型的元素,反转任何流的通用方法是什么? 具体问题: IntStream提供了range方法来生成特定范围内的,现在我想将其从0切换为负数将无法正常工作,也无法使用 与IntStream我会得到这个编译器错误 错误:(191,0)ajc:sorted()类型中的方法IntStream不适用于参数(Integer::compare