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@Anno(3) Object同时持有!

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

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

可能会有第三方库来解决字节码处理库,这些库将在运行时提供对这些注释的访问…

相关内容

  • 没有找到相关文章

最新更新