Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于实例创建的Java8注释_Java_Reflection_Annotations_Java 8 - Fatal编程技术网

关于实例创建的Java8注释

关于实例创建的Java8注释,java,reflection,annotations,java-8,Java,Reflection,Annotations,Java 8,在Javadocs for Annotations中,它声明可以用Java 8编写以下内容: new @Interned MyObject(); 是否仍然可以通过反射从这样注释的对象检索注释@Interned?我熟悉从方法、字段、类等检索注释的典型方法,但我想知道是否可以在Java 8中在运行时将特定实例与注释关联。应用于实例创建的注释,如new@Anno Object()不是已创建对象的属性,而只是new表达式的(编译时)类型。在运行时,对象的实际类型没有注释,就像它没有在实例创建时指定的泛

在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(2)对象
@Anno(1)对象
@Anno(4)对象
@Anno(3)对象
,在这段代码的末尾,同一对象甚至由两个不同类型的变量持有,
@Anno(1)对象
@Anno(3)对象
,同时

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

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


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

您是否尝试过使用“从方法、字段、类等检索注释的典型方法”?你做过实验吗?作为
运行时
,但我还没有尝试过。这些新注释是为新的应用程序而设计的。在不访问源代码或类文件的原始字节的情况下检索这些新批注可能不是一个好方法。@markspace及其在4.2.1中的示例是:
@Interned Double internedDoubleZero=new@Interned Double(0)因此注释位于字段和新实例上。。。因此,如果您只在右侧使用它,它可能只在编译时可用。对,这和其他一些事情让我对推荐OP访问这些注释感到紧张。Checker框架是一个您应该经常使用的工具。这种想法并不是让程序员在运行时滚动他们自己的检查器框架。我不知道它是专门为Checker框架设计的,但是我使用了Checker框架。我想知道是否有人知道是否有一种方法允许您从对象实例中获取注释,因为我知道的方法,例如
.getClass().getAnnotations()
思想专门用于类、字段、参数和方法,而不是实例。此外,据我所知,运行时保留是为了在运行时可以访问任何注释,否则在运行时您甚至无法从方法、字段、类或参数中获取注释。类型注释设计中心能够更好地对程序进行静态分析。这些注释可反射地用于Java程序反射所涵盖的部分——类和成员声明。但是反射并没有深入到Java表达式的级别——而且很可能永远不会很好。而且,即使他们这样做了,这也不会有什么帮助(想想你可能如何实现这一点,以及它将带来的成本。)
@Anno(1) Object o=new @Anno(2) Object();
@Anno(3) Object p=(@Anno(4) Object)o;