lombok的使用和原理

2023-10-28

版权声明:本文为博主原创文章,未经博主允许不得转载。    https://blog.csdn.net/DSLZTX/article/details/46715803
一、项目背景
在写Java程序的时候经常会遇到如下情形:
新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法
lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法。即它最终能够达到的效果是:在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法
比如源码文件:
import java.io.Serializable;
 
 
import lombok.Data;
 
 
@Data
public class BasicClusterInfo implements Serializable {
 
 
    private static final long serialVersionUID = 3478135817352393604L;
    private String            hbaseKey;
    private int               receiverCount;
}


以下是编译上述源码文件得到的字节码文件,对其反编译得到的结果
public class BasicClusterInfo extends java.lang.Object implements java.io.Serializable{
    public BasicClusterInfo();
    public java.lang.String getHbaseKey();
    public int getReceiverCount();
    public void setHbaseKey(java.lang.String);
    public void setReceiverCount(int);
    public boolean equals(java.lang.Object);
    public boolean canEqual(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
}


二、使用方法
使用lombok项目的方法很简单,分为四个步骤:
1)在需要自动生成getter和setter方法的类上,加上@Data注解
2)在编译类路径中加入lombok.jar包
3)使用支持lombok的编译工具编译源代码(关于支持lombok的编译工具,见“四、支持lombok的编译工具”)
4)编译得到的字节码文件中自动生成了getter和setter方法


三、原理分析
接下来进行lombok能够工作的原理分析,以Oracle的javac编译工具为例。
自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。
举例来说,现在有一个实现了"JSR 269 API"的程序A,那么使用javac编译源码的时候具体流程如下:
1)javac对源代码进行分析,生成一棵抽象语法树(AST)
2)运行过程中调用实现了"JSR 269 API"的A程序
3)此时A程序就可以完成它自己的逻辑,包括修改第一步骤得到的抽象语法树(AST)
4)javac使用修改后的抽象语法树(AST)生成字节码文件
详细的流程图如下:

lombok本质上就是这样的一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:
1)javac对源代码进行分析,生成一棵抽象语法树(AST)
2)运行过程中调用实现了"JSR 269 API"的lombok程序
3)此时lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
4)javac使用修改后的抽象语法树(AST)生成字节码文件


四、支持lombok的编译工具
1)由“三、原理分析”可知,Oracle javac直接支持lombok
2)常用的项目管理工具Maven所使用的java编译工具来源于配置的第三方工具,如果我们配置这个第三方工具为Oracle javac的话,那么Maven也就直接支持lombok了
3)Intellij Idea配置的编译工具为Oracle javac的话,也就直接支持lombok了。
4)Eclipse中使用的不是Oracle javac这个编译工具,而是自己实现的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得进行设置,具体是在Eclipse程序目录中的eclipse.ini文件中添加如下两行设置:
-javaagent:[lombok.jar所在路径]
-Xbootclasspath/a:[lombok.jar所在路径]


五、其他问题
现在使用Intellij Idea作为Java项目的IDE,配置Oracle javac作为编译工具。
现在有一个A类,其中有一些字段,没有创建它们的setter和getter方法,使用了lombok的@Data注解,另外有一个B类,它调用了A类实例的相应字段的setter和getter方法
编译A类和B类所在的项目,并不会报错,因为最终生成的A类字节码文件中存在相应字段的setter和getter方法
但是,IDE发现B类源代码中所使用的A类实例的setter和getter方法在A类源代码中找不到定义,IDE会认为这是错误
要解决以上这个不是真正错误的错误,可以下载安装Intellij Idea中的"Lombok plugin"。


六、lombok的罪恶
使用lombok虽然能够省去手动创建setter和getter方法的麻烦,但是却大大降低了源代码文件的可读性和完整性,降低了阅读源代码的舒适度。


参考文献:
[1]http://stackoverflow.com/questions/6107197/how-does-lombok-work
[2]https://projectlombok.org/download.html
[3]http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler
[4]http://www.ibm.com/developerworks/library/j-lombok/
[5]http://notatube.blogspot.com/2010/12/project-lombok-creating-custom.html
--------------------- 
作者:AllInCode 
来源:CSDN 
原文:https://blog.csdn.net/dslztx/article/details/46715803 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lombok的使用和原理 的相关文章

  • Lombok 之 @RequiredArgsConstructor 注解

    概念 spring注入对象有三种方法 xff0c 属性注入 xff0c 构造器注入 xff0c setter注入 但是如果属性太多 xff0c 一个个写太麻烦 xff0c 所以lombok提供了一个注解 xff0c 使用 64 Requir
  • 记lombok插件builder模式的一个坑

    使用lombok的builder模式时 如果属性有指定的默认值 不能使用静态的builder build 创建对象 正解见下文 一个坑 最近接手了一套代码 代码中的数据库表id用了UUID 有如下一个实体 import java util
  • lombok的使用和原理

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net DSLZTX article details 46715803 一 项目背景 在写Java程序的时候经常会遇到如下情形 新建了一个Class类 然后
  • eclipse安装lombok插件

    1 下载lombok jar lombok jar官方下载地址 https projectlombok org download 如果下载不了的话 下面是我个人的百度云资源 链接 https pan baidu com s 1Eiwy0Kb
  • TestNG+Mybatis+Extent+lombok管理测试

    一 项目结构 maven引入jar包
  • Lombok插件注解详解

    Lombok主要常用的注解 Data注解 在JavaBean或类JavaBean中使用 这个注解包含范围最广 它包含getter setter NoArgsConstructor注解 即当使用当前注解时 会自动生成包含的所有方法 Gette
  • 有没有办法为@AllArgsConstructor(lombok)的所有参数设置“not null”

    我正在使用 AllArgsConstructor我的类中的注释并希望确保参数不为空 有没有办法修改这个注释来实现这一点 或者我应该实现构造函数 谢谢 Getter Setter ToString AllArgsConstructor pub
  • 找不到符号错误:Lombok 1.18.6 不适用于 Gradle 5.2.1、JDK 10

    使用 Gradle 5 2 1 和 Lombok 1 18 6 依赖项进行的构建在 JDK 10 中失败 Lombok 注释似乎没有得到正确处理 我在源代码中的各种 Java 文件中不断收到 找不到符号 错误 对于为什么会发生这种情况有什么
  • Groovy:Lombok @NoArgsConstructor 未创建默认构造函数

    我在用lombok 1 18 6在我的春季启动项目中 我有 NoArgsConstructor但仍然得到org springframework orm jpa JpaSystemException No default constructo
  • 如何将 lombok 和 JPAMetalModel 处理器与 Maven 共存

    如何使用Lombok https projectlombok org 当 JPAMetaModelEntityProcessor 注释处理器在 Maven 构建中激活时 Maven 配置
  • 自定义龙目岛超级构建器

    我有一个父抽象类 Parent 和子类 Child 我正在使用 SuperBuilder 生成构建器 API 现在 我想对 Parent 和 Child 类的成员执行一些验证 作为构建的一部分 我找不到任何解决方案来自定义龙目岛超级构建器
  • 如何忽略 Jacoco 的 lombok.@UtilityClass?

    我用过lombok UtilityClass to 生成私有构造函数 使班级最终 将实用程序类中的所有字段设为静态 并且 Jacoco 不涵盖 Lombok 生成的代码 如果我显式定义一个私有构造函数 Jacoco 可以识别它 因此 有任何
  • module-info.java 不适用于 Java 9 中的 lombok

    我在将项目迁移到Java 9 更新 Java 9 后 我尝试运行项目 但遇到编译器错误 Error 6 1 java package javax annotation is not visible package javax annotat
  • Spring Boot 3 与 Lombok

    将我的项目从 Spring Boot 2 7 升级到 3 0 后 我得到 找不到标志 由于 Lombok 生成的代码而导致编译器错误 有什么方法可以让它协同工作 Spring Boot 3 和 Lombok 注释 您应该更新到 lombok
  • Lombok/Jackson - 用于 json 数组的 POJO

    我有一个 json 数组 需要从服务器接收 反序列化 并将其发送 序列化 到另一台服务器 Example car name string parts engine wheels 我开始编写以下 POJO 来表示这个 Json 数组 impo
  • 将 Dagger2 与 Lombok 结合使用

    有人用过 Lombok 1 16 和 Dagger2 吗 我当前的代码如下所示 AllArgsConstructor onConstructor Inject public class JuiceMaker private final Ap
  • Lombok 未在 Netbeans 项目中工作

    我想在项目中使用Lombok来使用 Getter和 Setter 我包括使用 Maven
  • Lombok @Builder 和 JPA 默认构造函数

    我将 Lombok 项目与 Spring Data JPA 一起使用 有什么办法可以连接龙目岛 Builder使用 JPA 默认构造函数 Code Entity Builder class Person Id GeneratedValue
  • 在抽象类上使用 Lombok @SuperBuilder 注释和 toBuilder ?

    我有以下课程 SuperBuilder toBuilder true public abstract class Parent SuperBuilder toBuilder true public class Child extends P
  • 用于布尔字段的 Lombok 注释 @Getter

    我正在使用 Java lombok 注释 Getter为我的 POJO 生成吸气剂 我有一个boolean按名称字段isAbc The Getter在这种情况下 注释会按名称生成一个方法isAbc 它不应该生成一个名为的方法吗isIsAbc

随机推荐

  • redis复习

    1 关系型数据库和非关系型数据库 关系型数据库 Relational Database 和非关系型数据库 Non relational Database 或 NoSQL Database 之间的主要区别可以从以下几个方面进行理解 1 1 数
  • 机器学习(数据分析)数学基础——线性代数篇(五)线性方程组

    求解线性方程组也算是考研中的必备技能了 它往往出现在大题的第一问 注 本篇需要一些线性代数基础 1 首先我们来解决r n的情况 线性方程组 import numpy as np from scipy import linalg 定义A矩阵
  • [Codeforces] number theory (R1900) Part.2

    Codeforces number theory R1900 Part 2 题单 https codeforces com problemset page 1 tags number 20theory 1601 1900 294C Shaa
  • 欧拉角(Euler angles)

    前言 本人也就英语4级水平 由于本篇中存在大量学术词汇 翻译时必然会有不当之处 原文可以在下面的链接中找到 具体意义各位可以自行斟酌 标红的部分是已发现存疑的翻译 也请各位指正 维基百科 欧拉角 欧拉角 欧拉角是由Lenhard Euler
  • C# 序列化与反序列化

    在C 网络编程中 为了传输复杂的数据类型 如类类型和容器 例如Dictionary List 我们需要将其转换成字节数组 C 中提供了序列化和反序列化来实现该方式 先转换成内存流 在转换成 public static System IO M
  • C++ vector、string使用

    vector就是类似于一个数组的容器 内容比数组更加全面 很多操作都有自己的函数可以直接拿过来进行使用 主要函数就是 v push back k 尾插元素 v insert it k 在任意位置插入元素 v eraser it it k 删
  • 让Win32窗口程序拥有控制台窗口

    让Win32窗口程序拥有控制台窗口 首先 为什么我们有了普通窗口后还要控制台窗口呢 因为我们可以用它方便的输出调试信息 而且普通玩家看到了也会觉得很高端 如果他会输几条命令 可能他会以为自己就是黑客了 示例效果 WinMain作为入口函数后
  • Zotero

    利用zotero插件添加及修改参考文献样式 1 1 zotero插件安装 1 2 zotero插件功能介绍 1 2 1 Add Edit Citation 参考文献引用样式及插入方法 1 2 1 1 选择及添加参考文献样式 1 2 1 2
  • gettimeofday时间

    elpi Preferences Help Guide About Trac Wiki Timeline Roadmap Browse Source View Tickets Search Start Page Index History
  • pytorch训练网络时报错:RuntimeError: received 0 items of ancdata

    错误的原因 dataloader加载数据时 pytorch多线程共享tensor是通过打开文件的方式实现的 而打开文件的数量是有限制的 当需共享的tensor超过open files限制时 即会出现该错误 解决方案 1 修改多线程的tens
  • 用php写密码输入强度,php计算密码强度

    下面的php代码用于测试给定密码的强度 最高强度为100 param String string return float Returns a float between 0 and 100 The closer the number is
  • 一年半前端工作经验试水杭州:我是如何拿下网易、阿里和滴滴 offer 的

    由于微信外链限制 推荐阅读等链接无法点击 可点击阅读原文跳转至原文 查看外链 前言 笔者毕业于东北大学 大学毕业社招进入环球网 前端开发工程师一职 技术栈 React node Github 地址 成果 来到杭州的目标非常的明确 大厂 其实
  • 刷脸支付服务商正迎来一次新的革命

    对于对手机操作不熟练 特别是不方便拿手机的人而言 刷脸支付简直不能更方便 支付行业一直是红海市场 而随着智能刷脸支付的推广 支付被推向风口 支付行业正迎来一次新的革命 一方面 正是因为市场火热 支付行业的宏观监管日趋严格 新兴的人工智能技术
  • Android 中设置EditText输入框提示文本hint的字体大小

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 一 布局文件activity custom hint xml
  • FloatingActionButton属性、用法,以及解析并解决sdk25以上只隐藏不显示的问题

    悬浮按钮 FloatingActionButton 在下文简称fab 今天我们来讲讲它的一些属性与用法 以及解析并解决sdk25以上FloatingActionButton只隐藏不显示的问题 先展示一下动态图 本次开发环境基于sdk25 使
  • 操作系统之文件管理:6、文件的基本操作(创建文件、打开文件、删除文件、关闭文件、读文件、写文件)

    5 文件的基本操作 思维导图 文件操作 创建文件 删除文件 读文件 写文件 打开文件 关闭文件 思维导图 文件操作 创建文件 删除文件 读文件 写文件 打开文件 1 在系统中有一张系统的文件打开表 用于管理所有打开的文件 2 在进程中有一张
  • Java调用类方法

    一 调用的是静态类 可以用类名直接调用 调用格式 类名 方法名 参数表 public class StaticCall public static void staticCall System out println Successfull
  • 机器学习之监督学习

    目录 1 监督学习 1 1 分类与回归 1 2 泛化 过拟合与欠拟合 1 3 监督学习算法 1 3 1 KNN K Nearest Neighbor 1 3 2 线性模型 1 3 3 决策树 随机森林 梯度提升回归树 梯度提升机 1 监督学
  • 【SPSS】百分位数计算方法探讨:SPSS计算差异

    由一道课后题引发的思考 节约时间 先说结论 在数据量大时各个方法得到的值差距不大 在数据量较小时推荐使用 三 方法4 也就是SPSS的默认方法 本周课程作业有一道非常简单 虽然事实证明此事并不简单 的题目 见下 计算下列数据的第32位百分数
  • lombok的使用和原理

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net DSLZTX article details 46715803 一 项目背景 在写Java程序的时候经常会遇到如下情形 新建了一个Class类 然后