Skip to content
微信扫码关注公众号

JEP 217: Annotations Pipeline 2.0 | 注解管道 2.0

摘要

重设计 javac 的注解处理流程,以更好地满足处理注解和工具的需求。

目标

  • 编译器在处理注解和类型注解时应正确行事:生成的类文件应具有所有类型注解的正确格式化属性。

  • 编译时反射(javax.lang.modeljavax.annotation.processing)应正确处理所有在签名可见位置的注解。

  • 运行时反射(核心反射)应正确处理类文件中的注解。

  • Checkers Framework 必须继续正常工作。

  • Java 编译器 API 应按设计继续正常工作。

非目标

不会添加新的语言特性或 API。不打算更新与注解相关的工具(如 javadocjavap)中的注解支持。

动机

Java SE 8 引入了两个新的注解特性,即 重复注解 (JEP 120)Java 类型上的注解 (JSR 308 / JEP 104)。此外,Lambda 表达式 (JSR 335 / JEP 126) 为注解添加了新的语法位置。这些特性都是在最初设计 javac 注解处理流程时不存在的,它们可以组合在一起,导致出现以下模式:

java
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 中新特性的交集。