关于实例创建的Java 8注释
在Javadocs for Annotations中,它声明以下内容可以用Java 8编写:
new @Interned MyObject();
无论如何都要从通过reflection注释的对象中检索注释@Interned? 我熟悉从方法,字段,类等中检索注释的典型方法,但我想知道在Java 8中是否可以在运行时将特定实例与注释相关联。
应用于实例创建的注释new @Anno Object()
如new @Anno Object()
不是创建对象的属性,而只是new
表达式的(编译时)类型。 在运行时,对象的实际类型没有注释,就像它没有您在创建实例时指定的Generic类型参数一样。
请考虑以下示例:
@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
同时拥有!
您可以使用审计工具来validation这些类型转换对于@Anno
所暗示的语义是否合法,但对于Java语言本身而言它们没有意义并且将始终被接受。 并且在运行时,实例的类型将始终是Object
不受类型注释的影响。
Reflection API提供了查询类和成员声明的带注释类型的方法,其中包括方法的参数和返回类型,但是您无法查询new
表达式的类型注释,因为您将无法确定方法是否实际包含new
表达式,更不用说键入应用于该new
表达式的注释。
可能有第三方库在字节代码处理库上安排,它们将在运行时提供对这些注释的访问…