首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 8实例创建注释

Java 8实例创建注释
EN

Stack Overflow用户
提问于 2014-08-14 19:04:08
回答 1查看 2K关注 0票数 8

在用于注释的Javadocs中,它声明可以用Java 8编写以下内容:

代码语言:javascript
运行
复制
new @Interned MyObject();

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-15 11:21:36

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

只需考虑以下示例:

代码语言:javascript
运行
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface Anno { int value(); }

代码语言:javascript
运行
复制
@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,不受类型注释的影响。

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25315752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档