听说隔壁用 Lombok 的六点就下班了,我也想六点下班!

好的,那么这篇文章就介绍下什么是 LombokLombok 做了什么以及 Lombok 是怎么做的

在介绍之前,先通过是否使用 Lombok 的效果来看下对比,首先来看下没有 Lombok 之前,我们的一个简单的 Java 对象(POJO)是长什么样子的:

哦,我的天啊,居然 60 行,好长啊!那我们接下来使用的 Lombok 来试下:

什么,只使用了 @Date 注解就可以实现之前 60 行的相同功能,代码长度整整缩小了 3 倍,这么神奇的嘛?那么让我们走进 Lombok 吧!

什么是 Lombok?

下面是 Lombok 官网的简介:

Lombok 简介

简而言之就是 Lombok 是一个很方便的插件,本质是个 Java 库,使用它通过相关注解就可以不用再编写冗长的 getter 或者 equals 等方法了。

接下来讲下 Lombok 实现的原理,这样就知道为什么要这样使用 Lombok 的注解了。

Lombok 实现原理

要讲 Lombok 的实现原理,在此之前就需要来说下注解的两种解析方式:运行时注解编译时注解

首先来看下运行时解析,比如 Spring 配置的 AOP 切面这些注解都是在程序运行的时候通过反射来获取的注解值,但是只有在程序运行时才能获取到这些注解值,导致运行时代码效率很低,并且如果想在编译阶段利用这些注解来进行检查,比如对用户的不合理代码作出错误报告,反射的方法就行不通了。

这就引出了第二种在编译时解析,Lombok 工具就是运行在编译时解析的。

那如何把注解与 Java 编译器结合使用呢?Java 也提供了两种解决方案:

第一种方案是注解处理器(Annotation Processing Tool),它最早是在 JDK 1.5 与注解(Annotation) 一起引入的,它是一个命令行工具,能够提供构建时基于源代码对程序结构的读取功能,能够通过运行注解处理器来生成新的中间文件,进而影响编译过程,不过它在 JDK 1.8 中被移除了,取而代之的是 JSR 269 插入式注解处理器(Pluggable Annotation Processing API),它是实现了 JSR 269 的机制,作为注解处理器的替代方案。

我们通过一个流程图来进一步说明注解处理器的工作原理:

首先写完代码后会调用 javac 编译,在编译后会生成抽象语法树(AST),之后会调用插入式注解处理器处理,上面说了插入式注解处理器会修改语法树,生成一些额外的代码,经过处理器的处理语法树会有变动,有变动之后,会再次到生成抽象语法树的处理环节,将变动后的代码再次生成抽象语法树,接着再通过注解处理器,如果这次语法树没有被修改,那么就会生成响应的字节码,变成 class 文件,以上就是整个注解处理器在整个 javac 编译源代码生成 class 文件中起到的作用。

在简单了解了 Lombok 实现原理后,让我们看下 Lombok 有哪些常见的注解:

Lombok 注解

下面是整理的常用的 Lombok 注解思维导图:

Lombok 注解

右侧上方的 @Getter、@Setter、@ToString、@EqualsAndHashCode 这几个名字大家都不陌生,无非就是帮我们生成对应的方法,这四个注解的总和也就是刚开始用的注解 @Data,这些注解都归结为常见方法的注解。

右侧下方的 @AllArgsConstructor、@RequiredArgsConstructor、@NoArgsConstructor分别为全参构造函数、必须参数构造函数、无参构造函数,它们通常为构造方法的注解。

左侧的 @NonNull 会自动生成空值校验;@CleanUp 会自动调用变量的 close 方法释放资源;@Builder 会自动生成构造者模式,方便对属性 set/get 操作;@Synchronized 会自动生成同步锁;@SneakyThrows 会自动生成 try/catch 捕捉异常;@Slf4j是日志相关的,会自动为类添加日志支持。

以上就是 Lombok 为我们提供的比较常用的注解。

Lombok 使用

首先需要安装 Lombok 插件,我在这里是以 IDEA 2019.3.1 版本来演示的:

安装 Lombok 插件

点击 File->Settings->Plugins,搜索 Lombok,然后点击安装 Lombok 插件:

在安装完插件后重启 IDEA,到此 Lombok 插件就安装完成了,接下来就要进行实践演示了:

Lombok 常用注解演示

首先在 pom 文件中引入依赖:

org.projectlombok        lombok        1.18.12provided

其中 provided 表示 jar 包是运行在编译时的,当程序编译成 class 源代码后,这个 jar 包就不会在源代码层面有所体现。

接下来演示 Lombok 注解使用方式,并通过查看编译后 class 文件,理解其工作原理,在这里以 @Getter 注解为例:

首先创建一个 GetterDemo 类,其中有 name 和 age 两个字段。

package com.wupx.lombok;import lombok.AccessLevel;import lombok.Getter;import lombok.NonNull;public class GetterDemo {    @Getter(value = AccessLevel.PRIVATE, onMethod_ = {@NonNull})    private String age;    @Getter(lazy = true)    private final String name = "wupx";}

我们在变量 age 上加上注解 @Getter,并且加上了参数来设置访问级别,通过 onMethod_ 参数可以为我们在生成的 getAge 方法添加上其他注解,比如 @NonNull;在name 上加上 @Getter 注解,并加上 lazy 参数并设为 true,表示开启懒加载。

接下来编译下,编译的 class 源代码如下:

package com.wupx.lombok;import java.util.concurrent.atomic.AtomicReference;import lombok.NonNull;public class GetterDemo {    private String age;    private final AtomicReference name = new AtomicReference();    public GetterDemo() {    }    @NonNull    private String getAge() {        return this.age;    }    public String getName() {        Object value = this.name.get();        if (value == null) {            synchronized(this.name) {                value = this.name.get();                if (value == null) {                    String actualValue = "wupx";                    value = "wupx" == null ? this.name : "wupx";                    this.name.set(value);                }            }        }        return (String)((String)(value == this.name ? null : value));    }}

可以发现生成后的源代码文件中,getAge 方法访问修饰符为 private,并且方法上有一个 @NonNull 的注解;getName 方法没有刚开始就初始化一个字符串,而是只有调用该方法的时候判断该字段是否为空,若为空,则初始化一个字符串并返回,这样就可以为开销大的初始化操作做一个懒加载,只有当使用的时候才会主动加载这个字段。

其他的注解方法大家可以自己去实践操作下。

Lombok 优缺点

在了解完 Lombok 之后,让我们来分析下 Lombok 的优缺点吧!

Lombok 的优点有以下几点:

  • 通过注解自动生成样板代码,提高开发效率
  • 代码简洁,只关注相关属性
  • 新增属性后,无需刻意修改相关方法

但是 Lombok 也有一些缺点:

  • 降低了源代码的可读性和完整性
  • 加大对问题排查的难度(可能问题定位到不存在的行,无从下手)
  • 强 x 队友,因为需要 IDE 的相关插件的支持

总结

本文介绍了什么是 Lombok,Lombok 做了什么以及 Lombok 的实现原理,并且分析了 Lombok 的利弊,大家在享受到它的好处的同时,也应该考虑到它带来的一些问题,你在工作中有被队友强 x 吗?你对 Lombok 怎么看?欢迎留言谈论!

lombok原理_听说学会用 Lombok 就可以让你早点下班?(你还不看)相关推荐

  1. lombok原理_十分钟搞懂Lombok使用与原理

    1 简介 Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它.Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的 ...

  2. rap技术原理_「水深坑多」做分子海绵,你还需要了解这些技术

    技术干货!快来收藏哦 做lncRNA/circRNA分子海绵研究,您需要了解这些技术: 1. Northern blot 2. RACE 3. FISH 4. RIP 5. RNA pull down ...

  3. stm32 薄膜键盘原理_铅锤哥:市面上的笔记本键盘优缺点解析,看完秒懂

    点击上面↑ 玩转电脑 关注铅锤哥,轻松学电脑 本文转自电脑快科技网 笔记本电脑的键盘,虽然看起来都差不多,但是这小小的键盘也分成许多种不同的类型,今天我们就来系统的介绍一下不同种类的笔记本电脑键盘,以 ...

  4. SpringCloud工作笔记065---lombok的使用和原理_在开发工具STS_eclipse_Idea中集成lombok

    JAVA技术交流QQ群:170933152 简单说就是在类中不用再写:get set方法,hashcode toStirng equals方法了 eclipse中集成: update时,勾选上Forc ...

  5. 听说用 Lombok 可以早点下班?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:分享一个牛逼的 Java 开源后台管理系统,不要造轮子了!个人原创+1博客:点击前往,查看更多 作者:武培轩 出 ...

  6. lombok依赖_为什么有些公司不让用 Lombok ?不要问,自己看吧

    来源:toutiao.com/i6820517160964588044 如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解.您是否正准备拥抱Lombok?还是正准备将如此酷 ...

  7. lombok依赖_使用Lombok 前你需要知道这些

    转自:树下魅狐 链接:https://ramostear.com/blog/2020/04/28/uk1860p8.html 不得不承认,Lombok 是一个很不错的 Java 库,它可以让你在少写代 ...

  8. lombok依赖_公司来了个新同事不会用 Lombok,还说我代码有问题

    新来的同事不会用 Lombok,所以会引发本文! 背景 最近公司新来一个搞 Java 的同事,搞了半天项目还没有跑起来,后来叫我过去帮他看一下,然后指着红色的编译错误和我说是不是代码有问题.. 我顿时 ...

  9. 计算机控制原理中雷达天线,什么是相控阵雷达_相控阵雷达原理_相控阵雷达原理图...

    什么是相控阵雷达 相控阵雷达又称作相位阵列雷达,是一种以改变雷达波相位来改变波束方向的雷达,因为是以电子方式控制波束而非传统的机械转动天线面方式,故又称电子扫描雷达. 相控阵雷达有相当密集的天线阵列, ...

最新文章

  1. 富国银行是如何为公有云转型做准备的
  2. Java-Java I/O 字节流之BufferedReader/BufferedWriter
  3. Day 17: 使用 JBoss Forge 和 OpenShift 构建部署 JAVA EE 6 应用
  4. pbr 多出口_PBR+多出口NAT+IP SLA
  5. excel 多列匹配相等后 引用值
  6. [mybatis]动态sql_choose_分支选择
  7. 阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end
  8. 计算机网络之数据链路层:11、CSMA/CD协议-随机访问介质访问控制
  9. php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
  10. vs2010学习版安装与激活
  11. 概率论与数理统计大作业实验报告
  12. Masked GCN论文解读
  13. 泛克里金方法的实际应用——小试牛刀
  14. 看狄仁杰如何让武则天戒色的
  15. Zeev Suraski、Andi Gutmans、Rasmus Lerdorf
  16. 人身三流指什么_什么是三流明星
  17. Hive sql 常用命令2
  18. Hander创建消息
  19. element清除表单校验
  20. 【Python123】 存款买房(B)

热门文章

  1. Windows 10 使用 Kali Linux子系统
  2. Arthas-MathGame
  3. js中立即执行函数会预编译吗_JavaScript预编译过程
  4. oracle 等待原因查找,oracle等待事件相关查询
  5. 计算机网络考试目的是什么,计算机网络基本原理考试大纲 -、课程的性质及其设置的目的与要求.doc...
  6. php查询字段前30个字符,php/json我的字段名被截断为30个字符。我能停下来吗?
  7. 用html制作广告图片切换效果,基于jquery实现图片广告轮换效果代码
  8. 奇妙的安全旅行之加密算法(完整版)
  9. STM32与多台MS5803压力传感器I2C通讯
  10. 协议簇:TCP 解析:TCP 数据传输