在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
表达式的类型注释了。
可能有第三方库建立在字节码处理库上,它将在运行时提供对这些注释的访问…
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句