- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当通过反射访问字段上定义的注释时(即使用 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/
一、反射 1.定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我
有没有办法从 JavaScript 对象内部获取所有方法(私有(private)、特权或公共(public))?这是示例对象: var Test = function() { // private m
我有一个抽象类“A”,类“B”和“C”扩展了 A。我想在运行时根据某些变量创建这些实例。如下所示: public abstract class A { public abstract int
假设我们在内存中有很多对象。每个都有一个不同的ID。如何迭代内存以找到与某些 id 进行比较的特定对象?为了通过 getattr 获取并使用它? 最佳答案 您应该维护这些对象的集合,因为它们是在类属性
假设我有这个结构和一个方法: package main import ( "fmt" "reflect" ) type MyStruct struct { } func (a *MyS
C#反射简介 反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。 反射是一种在.NET Framework中广
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段、方法、构造函数等)的能力。通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态
先来看一段魔法吧 public class Test { private static void changeStrValue(String str, char[] value) {
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型
反射 1. 反射的定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们
反射的定义 java的反射(reflection) 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到嘛,那么,我们就可以
我有一个 Java POJO: public class Event { private String id; private String name; private Lon
我编写了以下函数来检查给定的单例类是否实现了特征。 /** Given a singleton class, returns singleton object if cls implements T.
我正在研究 Java 反射的基础知识并观察有关类方法的信息。我需要获得一个符合 getMethod() 函数描述的规范的方法。然而,当我这样做时,我得到了一个 NoSuchMethodExceptio
我正在通过以下代码检索 IEnumerable 属性列表: BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public
我需要检查属性是否在其伙伴类中定义了特定属性: [MetadataType(typeof(Metadata))] public sealed partial class Address { p
我正在尝试使用 Reflections(由 org.reflections 提供)来处理一些繁重的工作,因此我不需要在很长的时间内为每个类手动创建一个实例列表。但是,Reflections 并未按照我
scala 反射 API (2.10) 是否提供更简单的方法来搜索加载的类并将列表过滤到实现定义特征的特定类? IE; trait Widget { def turn(): Int } class
我想在运行时使用反射来查找具有给定注释的所有类,但是我不知道如何在 Scala 中这样做。然后我想获取注释的值并动态实例化每个映射到关联注释值的带注释类的实例。 这是我想要做的: package pr
这超出了我的头脑,有人可以更好地向我解释吗? http://mathworld.wolfram.com/Reflection.html 我正在制作一个 2d 突破格斗游戏,所以我需要球能够在它击中墙壁
我是一名优秀的程序员,十分优秀!