lombok的@getter和@setter在编译期通过jsr 269注解处理器修改ast,为字段插入getter/setter方法节点,生成含完整方法的字节码,运行时零开销、无反射;需ide插件支持源码补全,但.class文件真实存在对应方法。

Lombok 的 @Getter 和 @Setter 并不直接修改字节码,而是在 javac 编译阶段介入 AST(抽象语法树),通过注解处理器动态插入方法节点,再由 javac 将修改后的 AST 编译成含完整 getter/setter 的 .class 文件。整个过程发生在编译期,运行时零开销、无反射、无字节码增强。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@Getter 和 @Setter 是怎么工作的
- 它们属于 JSR 269 编译期注解处理器(Annotation Processor),不是运行时注解
- 注解本身只起标记作用,真正干活的是 lombok 内置的
javac插件(即lombok.javac.apt.LombokProcessor) - 当 javac 执行到“注解处理阶段”时,会调用 lombok 的处理器,扫描所有带
@Getter/@Setter的字段或类
修改 AST 的关键步骤
- javac 先将源码解析为 AST(比如
JCClassDecl表示类声明,JCVariableDecl表示字段声明) - lombok 处理器遍历 AST,识别出被注解的字段(如
private String name;) - 在对应类的 AST 节点中,新增
JCMethodDecl节点:- 对
name字段生成public String getName() { return this.name; } - 生成
public void setName(String name) { this.name = name; }
- 对
- 这些新方法节点被挂载进类的成员列表,后续编译流程照常进行
为什么看不到生成的方法?但又能调用?
- 源码里确实没有写这些方法,IDE 显示“找不到符号”是正常现象(除非装了 Lombok 插件)
- IDEA/Eclipse 需要安装对应插件,才能让编辑器理解 AST 修改结果,实现代码补全和跳转
- 编译后生成的
.class文件里,已真实存在这些方法的字节码(可通过javap -c User.class验证)
注意几个实际细节
-
@Getter作用在boolean字段上,默认生成isXxx()而非getXxx() - 可用
@Getter(AccessLevel.PROTECTED)控制生成方法的访问修饰符 - 类上加
@Getter相当于给所有非静态字段批量加@Getter,但可对个别字段用@Getter(AccessLevel.NONE)禁用 -
@Setter不会为final字段生成 setter(编译时报错),这是 lombok 的安全保护
本质上,Lombok 没有黑科技,只是深度参与了 javac 的标准编译流水线,在 AST 层做“合法且干净”的代码注入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










