JEP 217: 注解管道 2.0
概述
重新设计 javac
注解管道,以更好地满足注解的需求以及处理注解的工具的需求。
目标
-
编译器在处理注解和类型注解时应表现正确:生成的类文件应包含格式正确的属性,以支持所有类型的注解。
-
编译时反射(
javax.lang.model
和javax.annotation.processing
)应正确处理所有在签名可见位置的注解。 -
运行时反射(核心反射)应能够正确处理类文件中的注解。
-
检查器框架 必须继续正常工作。
-
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.Next 项目 的一部分,javadoc
正在进行大量的改进工作。其中一部分工作包括将 javadoc
从使用较旧的 com.sun.javadoc
API 转换为使用 javax.lang.model
API。因此,本项目的目标并不是针对 javadoc
进行工作以确保注解(包括类型注解)能够正确显示。预计作为 JavaDoc.Next 项目的一部分,javadoc
将得到增强,以利用对 javax.lang.model
API 的更新,这也是本项目的一个目标。
测试
目前已经很好地覆盖了注解的大量端到端使用案例。这包括 JCK 和 langtools 回归测试。这项工作的很大一部分是开发进一步的测试,以确保成功指标的可测量性。
我们将创建测试,以运用上述 Java SE 8 中新特性之间的交叉部分。