Java 注解处理器返回 true 能否声明空注解集?
数据小许
结论
process 返回 true,表示当前处理器声明了本轮传入的注解类型。若注解集为空,就没有注解类型可供声明;这个返回值不会阻止其他处理器在最终轮次收到调用。
声明注解类型的处理结果和处理器是否收到某一轮调用,是两回事。最终轮次用于通知处理器注解处理即将结束。符合调用条件的处理器,即使收到的注解集为空,也可能被调用。
为什么最终轮次仍会调用处理器
注解处理分轮进行。处理器的 process 方法会收到当前轮次的注解类型集合和 RoundEnvironment。最终轮次中,RoundEnvironment.processingOver() 返回 true,而这一轮通常没有待处理的注解类型。
返回值决定本轮的注解类型是否交由后续处理器处理,不会取消最终轮次的通知。空集合中没有注解类型,因此返回 true 也没有可供后续处理器跳过的对象。
最终轮次的处理逻辑可以这样写:
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
// 执行处理结束前的清理或汇总工作
return false;
}
// 处理本轮收到的注解类型
return true;
}
示例中的 return true 表示处理器在非最终轮次声明了传入的注解类型。它不会要求停止后续轮次,也不决定最终轮次是否调用该处理器。
如何理解“声明空注解集”
当 annotations 为空时,处理器没有声明任何注解类型。其他处理器仍可能因最终轮次通知而被调用,并收到空集合。这里没有已声明的注解类型可供跳过,因此这与“后续处理器不会被要求处理已声明的注解类型”并不矛盾。
这条规则也适用于 processingOver() 返回 true 的情况:process 的返回值表示对本轮注解类型的声明,最终轮次是否调用处理器则由另一项处理流程决定。
备注:内容仅供参考。
