注解处理器运行前能否为@Builder标注类自动生成缺失的setter方法
注解处理器前置生成setter方法的可行方案
- 方案1:利用Javac AST(抽象语法树)修改API动态生成setter
你可以拆分注解处理器为两个执行阶段,或者独立两个处理器按顺序执行:第一阶段遍历所有标注了@Builder的类,检查每个字段对应的setter方法是否存在,不存在的话通过Javac提供的com.sun.source.tree相关API,手动构造setter方法的语法树节点插入到目标类的AST结构中。该操作发生在字节码生成之前,修改后的AST会参与后续编译流程,你的原有Builder生成逻辑在后续轮次处理时,就能正常识别到这些动态生成的setter方法。
该方案的限制是依赖Javac的内部非标准API,不同JDK版本的API存在差异,如需兼容ECJ(Eclipse编译器)还需要单独适配ECJ的AST修改接口。 - 方案2:拆分编译流程分阶段处理
通过构建工具(Maven/Gradle)配置多阶段编译任务:第一阶段先编译所有目标类的源码,拿到生成的.class文件后用ASM/Javassist插入缺失的setter方法,输出到临时的类路径目录;第二阶段将临时目录加入编译类路径,运行你现有的注解处理器完成Builder类的生成。该方案不需要依赖编译器内部API,兼容性更强,只是需要额外调整构建脚本的执行顺序。 - 方案3:调整现有Builder生成逻辑规避setter依赖
直接修改你的Builder生成规则,不需要依赖目标类的setter方法:生成的Builder类的build()方法可以直接调用目标类的全参构造方法赋值,或者如果目标类字段可访问的话直接为字段赋值,完全不需要额外生成setter方法,这个方案改造成本最低,兼容性最好。
补充说明:如果你的
@Builder注解需要支持公开给第三方使用,优先选择方案2或3,避免内部编译器API的兼容性问题。
内容的提问来源于stack exchange,提问作者Ilias Tzortzinis
相关产品推荐
相关产品推荐

