Java 8 关于实例创建的注释

标签 java reflection annotations java-8

在注释的 Javadocs 中,它指出可以用 Java 8 编写以下内容:

new @Interned MyObject();

是否有办法通过反射从这样注释的对象中检索注释@Interned?我熟悉从方法、字段、类等检索注释的典型方法,但我想知道是否可以在 Java 8 中将特定实例与运行时的注释关联起来。

最佳答案

应用于实例创建的注释(例如new @Anno Object())不是所创建对象的属性,而只是(编译时)类型的属性new 表达式。在运行时,对象的实际类型没有注释,就像它没有您在实例创建时可能指定的通用类型参数一样。

请考虑以下示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface Anno { int value(); }

@Anno(1) Object o=new @Anno(2) Object();
@Anno(3) Object p=(@Anno(4) Object)o;

这里,简单对象经历了几次类型更改,从 @Anno(2) Object@Anno(1) Object@Anno(4 ) Object@Anno(3) Object,在这段代码的末尾,同一个对象甚至由两个不同类型的变量 @Anno(1) Object 保存code> 和 @Anno(3) Object,同时!

您可以使用审核工具来验证这些类型转换就 @Anno 暗示的任何语义而言是否合法,但对于 Java 语言本身来说,它们没有任何意义,并且始终会被接受。并且在运行时,实例的类型始终是Object,不受类型注释的影响。

Reflection API 提供了查询类和成员声明的带注释类型的方法,其中包括方法的参数和返回类型,但您无法查询 new 表达式的类型注释,因为您不会能够查明方法是否实际上包含 new 表达式,更不用说应用于该 new 表达式的类型注释了。

可能有第 3 方库定居在字节码处理库上,这些库将在运行时提供对这些注释的访问......

关于Java 8 关于实例创建的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25478802/

相关文章:

java - ArrayList 的后备数组的长度与 ArrayList 的 .size() 不同

java - 以复杂数据类型作为输入的 Web 服务

kubernetes 如何从命名空间注解继承注解继承

java - JSONArray 对数据进行额外转义

JavaFX 启动屏幕按钮 onClick 后出现错误

java - 如何使用 Dagger 2 在 Quartz 作业中注入(inject)依赖项

java - Hibernate @OneToMany - 映射到多个连接表

c# - 如何测试类的实例是否为特定泛型类型?

java - 与 Class.forName() 松耦合

function - 如何在 Rust 中找到函数调用者的类型?