JEP 217: Annotations Pipeline 2.0 | 注解管道 2.0
摘要
重设计 javac
的注解处理流程,以更好地满足处理注解和工具的需求。
目标
编译器在处理注解和类型注解时应正确行事:生成的类文件应具有所有类型注解的正确格式化属性。
编译时反射(
javax.lang.model
和javax.annotation.processing
)应正确处理所有在签名可见位置的注解。运行时反射(核心反射)应正确处理类文件中的注解。
Checkers Framework 必须继续正常工作。
Java 编译器 API 应按设计继续正常工作。
非目标
不会添加新的语言特性或 API。不打算更新与注解相关的工具(如 javadoc
和 javap
)中的注解支持。
动机
Java SE 8 引入了两个新的注解特性,即 重复注解 (JEP 120) 和 Java 类型上的注解 (JSR 308 / JEP 104)。此外,Lambda 表达式 (JSR 335 / JEP 126) 为注解添加了新的语法位置。这些特性都是在最初设计 javac
注解处理流程时不存在的,它们可以组合在一起,导致出现以下模式:
Function<String, String> fss = (@Anno @Anno String s) -> s;
现有的注解处理流程无法直接处理这类情况;因此,为了适应新的使用情况,原始设计已经被扭曲,导致实现变得脆弱且难以维护。这项工作的目标是用一个更简单直接的新架构取代这个过时的架构,从而实现更正确和可维护的代码。
描述
重构 javac
的注解处理流程。除了修复错误和提高正确性之外,这在外部不会产生明显的影响。第一步是提高测试覆盖率,以便可以衡量和评估我们的退出标准。之后进行一系列的增量重构。这项工作将在 OpenJDK 的 Annotations Pipeline 2.0 项目 中完成。
javadoc
工具与类型注解相关的问题。然而,javadoc
正在作为 Javadoc.Next 项目 的一部分进行重大工作。其中一部分工作是将 javadoc
改为使用 javax.lang.model
API 而不是较旧的 com.sun.javadoc
API。因此,本项目的目标并非在 javadoc
上工作以确保注解(包括类型注解)被正确呈现。预计,作为 JavaDoc.Next 项目的一部分,javadoc
将利用本项目目标的 javax.lang.model
API 的更新。
测试
已经对大量关于注解的端到端使用案例进行了很好的覆盖。这包括 JCK 和 langtools 回归测试。这项工作的一个重要部分是开发进一步的测试,以确保成功度量的可衡量性。
我们将创建测试来验证上述 Java SE 8 中新特性的交集。