PAYATHON 2026

Java 注解处理最后一轮是否保证注解集和根元素集为空?

数据小陈

结论

是。根据 Java 注解处理 API 对最后一轮的约定,当 roundEnvironment.processingOver() 返回 true 时,roundEnvironment.getRootElements() 返回空集合,传给 Processor#process 的 annotations 也为空。因此,这段断言在标准注解处理流程中成立:

assert roundEnvironment.processingOver() ?
    annotations.isEmpty() && roundEnvironment.getRootElements().isEmpty() :
    true;

原因

注解处理会分多轮进行。处理器生成新的源文件或类文件后,编译器可以开始下一轮。最后一轮用于通知处理器处理即将结束;这一轮的根元素集合为空,因此没有待处理的注解类型,annotations 也为空。

使用时的注意事项

  • processingOver() 为 false 时,不能据此断定两个集合都非空。某一轮没有相关注解时,annotations 也可能为空。
  • processingOver() 返回 true 时,可以执行收尾工作,例如汇总处理结果或关闭资源。此时不要依赖根元素集合获取待处理类型。
  • 该断言只检查 API 约定的集合状态,不代表处理器此前没有遇到编译错误或其他问题。

备注:内容仅供参考。