做网站维护的是什么公司,中天建设集团有限公司西南分公司,为什么企业要建设自己的企业文化,做一下网站需要什么条件文章目录 Lombok 的实现原理概述以 Builder 为例#xff1a;解析 Lombok 如何生成 Builder 模式示例代码#xff1a;没有 Lombok 的 Builder 模式使用 Lombok 的 Builder 简化代码 Lombok 如何实现 Builder#xff1a;源码解析案例演示#xff1a;自定义构造逻辑Lombok 的代… 文章目录 Lombok 的实现原理概述以 Builder 为例解析 Lombok 如何生成 Builder 模式示例代码没有 Lombok 的 Builder 模式使用 Lombok 的 Builder 简化代码 Lombok 如何实现 Builder源码解析案例演示自定义构造逻辑Lombok 的代码生成优势总结推荐阅读文章 Lombok 作为 Java 开发中的“魔法工具”极大简化了样板代码的编写需求比如
getter/
setter、构造函数、
toString、
equals、
hashCode 以及
Builder 模式等。然而很多人可能好奇Lombok 是如何实现的为何我们只需要一个注解就能自动生成这些代码呢 本文将通过解析 Lombok 的实现原理并结合 Builder 注解的具体示例带你一步步揭开 Lombok 的神秘面纱。 Lombok 的实现原理概述
Lombok 的核心机制在于注解处理器Annotation Processor和抽象语法树AST操作。在 Java 编译阶段Lombok 的注解处理器会捕捉和解析源代码中的注解然后通过修改 AST抽象语法树来添加新的方法、构造器等代码最终生成编译后的字节码。 注解处理器Lombok 利用 JSR 269 提供的注解处理 API如 javax.annotation.processing.Processor 接口来捕捉 Java 编译过程中的注解。Lombok 的注解处理器会在编译时扫描项目中的 Lombok 注解如 Getter、Setter然后调用相应的代码生成逻辑。 修改 ASTLombok 利用 Javac 或 Eclipse 等编译器内部 API 直接操作抽象语法树将新方法或字段等直接插入到 AST 中实现代码的“动态扩展”。 编译输出经过 Lombok 注解处理的代码在 AST 被修改后会直接编译成字节码不再额外生成 .java 文件。这就是 Lombok 生成的代码能在编译期生效而不影响源码的原因。 以 Builder 为例解析 Lombok 如何生成 Builder 模式
示例代码没有 Lombok 的 Builder 模式
首先我们来看一个传统的 Builder 模式实现
public class User {private String name;private int age;private User(Builder builder) {this.name builder.name;this.age builder.age;}public static class Builder {private String name;private int age;public Builder name(String name) {this.name name;return this;}public Builder age(int age) {this.age age;return this;}public User build() {return new User(this);}}
}// 使用
User user new User.Builder().name(Alice).age(25).build();这种方式虽然有效但代码略显冗长特别是当类的字段较多时Builder 类的代码量将成倍增加。
使用 Lombok 的 Builder 简化代码
通过 Lombok 的 Builder 注解我们可以轻松实现 Builder 模式大幅减少样板代码
import lombok.Builder;Builder
public class User {private String name;private int age;
}// 使用
User user User.builder().name(Alice).age(25).build();在此代码中我们仅需一个 Builder 注解Lombok 就能自动生成 Builder 类并提供链式调用的构建方法。这背后就是 Lombok 操作 AST 的“魔法”。 Lombok 如何实现 Builder源码解析
注解处理器捕获 BuilderLombok 的注解处理器会在编译时扫描 Builder 注解识别到需要应用 Builder 模式的类。AST 操作Lombok 利用编译器的 AST API动态插入 UserBuilder 类并为每个字段生成 setter 方法。最终的代码结构会类似于我们手写的传统 Builder 类。生成静态 builder() 方法在目标类 User 中插入一个 builder() 静态方法用于实例化 UserBuilder 类。这使得我们可以通过 User.builder() 调用构建对象。
在编译后的字节码中Lombok 自动生成的代码结构如下
public class User {private String name;private int age;public static UserBuilder builder() {return new UserBuilder();}public static class UserBuilder {private String name;private int age;public UserBuilder name(String name) {this.name name;return this;}public UserBuilder age(int age) {this.age age;return this;}public User build() {return new User(this.name, this.age);}}
}Lombok 会自动将这些代码生成并编译为字节码文件因此我们不需要额外编写 UserBuilder 类。 案例演示自定义构造逻辑
有时我们可能希望在构造过程中加入一些自定义逻辑例如对字段进行校验。让我们看看 Lombok 的 Builder 如何与自定义构造逻辑结合。
import lombok.Builder;Builder
public class Product {private String name;private double price;private Product(String name, double price) {if (price 0) {throw new IllegalArgumentException(Price cannot be negative);}this.name name;this.price price;}
}// 使用
Product product Product.builder().name(Laptop).price(999.99).build();在此代码中我们手动定义了 Product 类的构造方法Builder 会调用此构造方法因此在创建 Product 对象时会触发校验逻辑确保价格不为负数。 Lombok 的代码生成优势
Lombok 的注解处理机制和 AST 操作带来了几个显著优势
减少样板代码开发者只需声明字段和注解即可Lombok 会自动生成所有必需的构造方法和构建器方法。可读性提升通过使用 Builder 等注解代码逻辑更加简洁和易读。灵活性Lombok 可以与手写代码兼容允许在 Builder 模式下添加自定义构造方法以满足业务需求。编译期生成Lombok 所有的代码生成操作均在编译期完成不会影响运行期性能。 总结
Lombok 的 Builder 是基于注解处理器和 AST 操作的强大工具极大地简化了 Java 中常见的样板代码尤其是 Builder 模式的实现。Lombok 不仅支持简单的对象构建还允许开发者通过自定义构造方法来实现更复杂的初始化逻辑。
Lombok 的底层实现让我们不用关注复杂的 AST 操作只需简单的注解即可实现强大的构建功能。通过对 Builder 工作原理的理解我们可以更深入地掌握 Lombok并在需要时进行灵活调整。希望本文能帮助你更好地利用 Lombok 的“魔法”简化开发过程
推荐阅读文章 探索 Lombok 的 Builder 和 SuperBuilder避坑指南一 为什么用了 Builder 反而报错深入理解 Lombok 的“暗坑”与解决方案二 由 Spring 静态注入引发的一个线上T0级别事故真的以后得避坑 如何理解 HTTP 是无状态的以及它与 Cookie 和 Session 之间的联系 HTTP、HTTPS、Cookie 和 Session 之间的关系 什么是 Cookie简单介绍与使用方法 什么是 Session如何应用 使用 Spring 框架构建 MVC 应用程序初学者教程 有缺陷的 Java 代码Java 开发人员最常犯的 10 大错误 把握Java泛型的艺术协变、逆变与不可变性一网打尽 Java Spring 中常用的 PostConstruct 注解使用总结 如何自定义一个自己的 Spring Boot Starter 组件从入门到实践 解密 Redis如何通过 IO 多路复用征服高并发挑战 线程 vs 虚拟线程深入理解及区别 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别 10大程序员提升代码优雅度的必杀技瞬间让你成为团队宠儿