内部源保留注释的表示

时间:2015-05-29 13:39:41

标签: java annotations annotation-processing

我们有这个课程:

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 {}

如果我们call

,注释处理将失败
myClass.getEnclosedElements()

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

original problem

1 个答案:

答案 0 :(得分:2)

  

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

应该。

13.1. The Form of a Binary

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

4.7.6. The InnerClasses Attribute

  

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

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