繁体   English   中英

创建实例的Java 8注释

[英]Java 8 Annotations on Instance creation

在Javadocs for Annotations中,它指出可以用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@Anno(3) Object同时保存!

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

Reflection API提供了查询类和成员的声明的带注释的类型的方法,其中包括方法的参数和返回类型,但是您无法查询new表达式的类型的注释,因为您将无法找出方法是否真正包含一个new表达式,更不用说对该new表达式应用类型注释了。

可能有第三方库建立在字节码处理库上,它将在运行时提供对这些注释的访问…

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM