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 约定的集合状态,不代表处理器此前没有遇到编译错误或其他问题。
备注:内容仅供参考。
