我们有这个课程:
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
,则处理正常。
答案 0 :(得分:2)
我的问题是:导出的二进制文件(jar)是否包含
MyClass$MyInterface.class
文件?
应该。
- 每个类必须包含对其所有成员类型的符号引用,以及出现在其方法,构造函数,静态初始值设定项,实例初始值设定项和字段初始值设定项中的所有本地和匿名类。
醇>
4.7.6. The InnerClasses
Attribute:
如果类或接口具有类或接口的成员,则其
constant_pool
表(以及其InnerClasses
属性)必须引用每个此类成员,即使该成员未另行提及上课。
因此MyClass
必须引用MyInterface
。虽然我没有对此进行引用,但似乎如果有对特定类的引用,那么应该编译该类。