Lombok 实现原理是什么?

更新时间 2023-07-29 14:35:28

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

前面《Lombok 注解》 一章中,我们已经熟悉了 Lombok 相关注解,以及使用方法。你可能会好奇, Lombok 的实现原理是什么?Lombok 是如何魔力般地简化我们的 Java 代码的呢?本小节中,我们将一窥究竟。

关于注解处理器

Lombok 的秘密武器是注解处理器(Annotation Processor)。这是 Java 编译器的一部分,它可以在编译阶段检查和处理注解。

在 Java 中,当我们使用 javac 命令编译源代码时,编译器会首先解析源代码,生成一棵语法树。然后,注解处理器就会遍历这棵语法树,找到我们的注解,对它们进行处理。

例如,当注解处理器遇到 Lombok 的 @Getter 注解时,它就会在语法树中添加 getter 方法。这样,当编译器继续编译语法树时,它就会生成包含 getter 方法的字节码。

Lombok 的工作原理

Lombok 实现了一系列自己的注解处理器,每一个处理器都负责处理一种或几种注解。

例如,GetterProcessor 处理 @Getter 注解,SetterProcessor 处理 @Setter 注解,EqualsAndHashCodeProcessor 处理 @EqualsAndHashCode 注解等等。

当处理器遇到对应的注解时,它会在语法树中添加相应的代码。例如,GetterProcessor 会为每一个标记了 @Getter 注解的字段添加 getter 方法。

示例讲解

现在,我们来看一个具体的示例,帮助我们理解 Lombok 是如何工作的。

假设我们有一个 User 类,使用了 @Getter@Setter 注解:

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private int age;
}

当我们编译这个 User 类时,javac 会首先解析源代码,生成一棵语法树。然后,Lombok 的 GetterProcessorSetterProcessor 会找到 @Getter@Setter 注解,为 nameage 字段添加 getter 和 setter 方法。最后,javac 会编译这棵已经被修改过的语法树,生成包含 getter 和 setter 方法的字节码。

需要注意的是,我们在源代码中并没有写 getter 和 setter 方法,但是在编译后的字节码中,这些方法就出现了。这就是 Lombok 的魔力。

Lombok 的局限性

虽然 Lombok 带来了许多好处,但也有一些限制需要注意:

  1. IDE 支持: 尽管大多数主流 IDE(如 IntelliJ IDEA、Eclipse)都支持 Lombok,但有时可能需要安装 Lombok 插件或配置一些设置,以确保 IDE 能够正确处理 Lombok 注解。
  2. 维护性: 如果你决定在项目中使用 Lombok,新的开发者可能需要时间来理解 Lombok 注解的含义和作用。
  3. 仅作用于编译阶段:由于 Lombok 是在编译阶段修改语法树,所以它不能处理运行时的注解。
  4. 干扰性:此外,由于 Lombok 修改了语法树,所以在某些情况下,它可能会干扰其他的注解处理器。

结语

本小节中,我们了解了 Lombok 的实现原理。虽然 Lombok 在背后做了很多复杂的工作,但是对于我们开发者来说,我们只需要理解和记住一点:Lombok 可以通过注解,帮助我们自动地生成和管理常见的、繁琐的 Java 代码。