2015-05-29 102 views
1

的我们有这个类:表示内源保留注释

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

    @MyInterface 
    public void hello() { } 
} 

正如你所看到的,它有一个内部的唯一来源的注释。我的问题是:导出的二进制文件(jar)是否包含MyClass$MyInterface.class文件?如果我们看保留,我们可以说不,因为这个注释应该被编译器丢弃。但是它仍然被添加到MyClass.class的内部类的列表中,并且MyClass$MyInterface.class文件也被创建。

如果我们call

myClass.getEnclosedElements() 

MyClass$MyInterface.class不存在当我们对这种类

public class MyProcessedClass extends MyClass {} 

运行注释处理器注释处理失败。如果存在MyClass$MyInterface.class,则处理正常。

original problem

+0

在'myClass.getEnclosedElements()'中,什么是'myClass'?表示“MyClass”或“MyProcessedClass”的'TypeElement'? – Radiodef

+0

这应该是MyClass。 – WonderCsabo

回答

2

我的问题是:要导出的二进制文件(JAR)包含MyClass$MyInterface.class文件或没有?

它应该。

13.1. The Form of a Binary

  • 每个类必须包含其所有成员类型的符号引用,并出现在其方法,构造所有本地和匿名类,静态初始化器,实例初始化器和字段初始化器。
  • 4.7.6. The InnerClasses Attribute

    如果一个类或接口具有成员是类或接口,其constant_pool表(以及因此它的InnerClasses属性)必须是指每个这样的构件,即使该成员没有另外提到的班级。

    因此MyClass必须有对MyInterface的参考。虽然我没有引用它,但是如果有一个特定类的引用,那么这个类应该被编译。

    +0

    谢谢!我也检查了JLS和JVM规范,但我认为我搜索了错误的条款。 – WonderCsabo