PAYATHON 2026

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 的返回值表示对本轮注解类型的声明,最终轮次是否调用处理器则由另一项处理流程决定。

备注:内容仅供参考。