Lombok实现浅析

本文深入剖析了 Lombok 的工作原理,详细介绍了它是如何利用 Java 编译器的注解处理机制,在编译阶段对源代码进行自动注解处理和语法树修改,从而简化日常编码任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信很多同学都有用过Lombok,今天我们来扒一扒它的实现机制。

简单来讲,Lombok就是在编译时对抽象语法树(AST)进行了修改来实现它的功能。要了解Lombok是怎么做的,那我们需要先了解下Java语言的编译器是怎么工作的。

javac

Java的编译过程可以分成三个阶段:

  1. 所有源文件会被解析成语法树。
  2. 调用注解处理器。如果注解处理器产生了新的源文件,新文件也要进行编译。
  3. 最后,语法树会被分析并转化成类文件。

过程实现在JavaCompiler。我们这里只了解个大概先。

AnnotationProcessor

JSR-269提供了一种插件式的注解处理机制,通过ServiceLoader机制可以给Java编译器插上我们自己的注解处理器。也就是说,在上述编译过程的第二阶段,是允许用户介入的。

正是通过这个机制,Lombok迈出了第一步。来看下Lombok的jar包,

javax.annotation.processing.Processor是个配置点,Lombok的实现也就是该文件的内容如下:

lombok.core.AnnotationProcessor

也就意味着,在编译的第二阶段会执行lombok.core.AnnotationProcessor。它所做的工作就是我们上面所说的,修改AST。

It's a total hack

但是在JSR-269的规范里面,并没有提供修改AST的API,那么Lombok是怎么达到它的目的的?It's a total hack. Using non-public API. 这是Lombok的作者所说的。也就是说Lombok是使用了一些内部的API,也许是通过强制类型转换也许是其他,这个后续再探讨,现在只需要明白一点,Lombok有风险,使用需谨慎^_^ 如果某天发布的新版本JDK修改了那些内部API,那么我们使用了Lombok的代码在那个版本的JDK上面将无法编译通过,我们就要寄希望于Lombok的工程师们进行修复升级了,万一修复不了呢?总之,是个坑哈。

参考资料

### 配置和使用Lombok的方法 #### 1. 添加Lombok依赖 如果项目是一个Maven项目,则可以在`pom.xml`文件中添加Lombok的依赖项。以下是具体的依赖配置: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <!-- 版本号可以根据实际需求调整 --> <scope>provided</scope> </dependency> ``` 这里的`<scope>`设置为`provided`表示Lombok仅在编译阶段起作用,运行时不需打包到最终的应用程序中[^2]。 如果是普通的Java项目而非Maven项目,则需要手动下载Lombok的JAR包并将其添加到项目的类路径中。具体步骤如下: - 下载[Lombok JAR](https://projectlombok.org/download)。 - 将下载的JAR文件放入项目的根目录或其他合适位置。 - 在IDEA中右键点击该JAR文件,选择`Add as Library`以完成添加[^5]。 #### 2. 安装Lombok插件 为了使IDE能够识别Lombok注解并在编辑器中提供支持,还需要安装对应的IDE插件: - 打开IntelliJ IDEA,进入`File -> Settings -> Plugins`。 - 搜索"Lombok Plugin"并安装。 - 安装完成后重启IDEA以应用更改。 #### 3. 启用Annotation Processor 为了让IDE正确处理由Lombok生成的代码片段,必须启用注解处理器功能: - 进入`File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors`。 - 勾选`Enable annotation processing`选项[^4]。 #### 4. 使用Lombok注解简化代码 一旦完成了上述准备工作,就可以通过一系列预定义的注解来减少样板代码的数量。例如: - `@Getter/@Setter`: 自动生成getter/setter方法; - `@ToString`: 自动创建toString()方法; - `@EqualsAndHashCode`: 自动生成equals()和hashCode()方法; - `@NoArgsConstructor`, `@AllArgsConstructor`, 和`@RequiredArgsConstructor`: 自动生成无参构造函数、全参数构造函数或者基于final字段/带有`@NonNull`标注字段的构造函数; - `@Data`: 组合了@Getter、@Setter、@ToString、@EqualsAndHashCode以及@NoArgsConstructor的功能; 下面展示了一个简单例子,演示如何利用`@Data`快速构建一个实体类而无需显式编写任何辅助方法: ```java import lombok.Data; @Data public class User { private String name; private int age; } ``` 以上代码会自动生成name属性与age属性的相关getter和setter方法、toString方法以及其他必要的逻辑[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值