【问题标题】:Representation of inner source-retained annotation内部源保留注释的表示
【发布时间】:2015-05-29 13:39:41
【问题描述】:

我们有这个课程:

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)

【问题讨论】:

  • myClass.getEnclosedElements() 中,myClass 是什么? TypeElement 代表 MyClassMyProcessedClass?
  • 应该是 MyClass。

标签: java annotations annotation-processing


【解决方案1】:

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

应该的。

13.1. The Form of a Binary:

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

4.7.6. The InnerClasses Attribute:

如果一个类或接口的成员是类或接口,则其constant_pool 表(以及因此其InnerClasses 属性)必须引用每个此类成员,即使该成员未在该类中以其他方式提及。

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

【讨论】:

  • 谢谢!我还检查了 JLS 和 JVM 规范,但我认为我搜索了错误的术语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2010-12-14
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多