Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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
Java 内源保留注释的表示_Java_Annotations_Annotation Processing - Fatal编程技术网

Java 内源保留注释的表示

Java 内源保留注释的表示,java,annotations,annotation-processing,Java,Annotations,Annotation Processing,我们有这样的课程: public class MyClass { @Retention(RetentionPolicy.SOURCE) private @interface MyInterface { } @MyInterface public void hello() { } } 如您所见,它有一个内部的、仅源代码的注释。我的问题是:导出的二进制文件(jar)是否应该包含MyClass$MyInterface.class文件?如果我们看一下保留,我们可以说不

我们有这样的课程:

public class MyClass {
    @Retention(RetentionPolicy.SOURCE)
    private @interface MyInterface { }

    @MyInterface
    public void hello() { }
}
如您所见,它有一个内部的、仅源代码的注释。我的问题是:导出的二进制文件(jar)是否应该包含
MyClass$MyInterface.class
文件?如果我们看一下保留,我们可以说不是,因为编译器应该丢弃这个注释。但是,它仍然添加到
MyClass.class
中的内部类列表中,并且还创建了
MyClass$MyInterface.class
文件

当我们对这个类运行注释处理器时

public class MyProcessedClass extends MyClass {}
如果我们

MyClass$MyInterface.class
不存在。如果存在
MyClass$MyInterface.class
,则处理正常

()

我的问题是:导出的二进制文件(jar)是否应该包含
MyClass$MyInterface.class
文件

应该这样

:

  • 每个类必须包含对其所有成员类型的符号引用,以及对其方法、构造函数、静态初始值设定项、实例初始值设定项和字段初始值设定项中出现的所有本地类和匿名类的符号引用
  • :

    如果类或接口具有属于类或接口的成员,则其
    常量池
    表(以及其
    InnerClasses
    属性)必须引用每个此类成员,即使该类未另行提及该成员


    因此
    MyClass
    必须有对
    MyInterface
    的引用。虽然我没有引证,但似乎如果有对特定类的引用,那么应该编译该类。

    myClass.getEnclosedElements()
    中,什么是
    myClass
    ?一个
    TypeElement
    表示
    MyClass
    MyProcessedClass
    ?应该是MyClass。谢谢!我还检查了JLS和JVM规范,但我想我搜索了错误的术语。
    myClass.getEnclosedElements()