当前位置: 首页 > news >正文

Java基础学习总结(38)——Lombok的使用和原理

一、项目背景 

在写Java程序的时候经常会遇到如下情形: 
新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 
lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法。即它最终能够达到的效果是:在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法 
比如源码文件: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}

以下是编译上述源码文件得到的字节码文件,对其反编译得到的结果 

?
1
2
3
4
5
6
7
8
9
10
11
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网址:https://projectlombok.org/download.html

Eclipse支持需要点击运行下载的jar包

Maven依赖:

?
1
2
3
4
5
6
< dependency >
     < groupId >org.projectlombok</ groupId >
     < artifactId >lombok</ artifactId >
     < version >1.16.6</ version >
     < scope >provided</ scope >
</ dependency >

使用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

转载于:https://www.cnblogs.com/zhanghaiyang/p/7213156.html

相关文章:

  • Educational Codeforces Round 11
  • 程序中的得与失
  • nodejs中下载文件回调问题
  • 你所不知的SEO高级策略技巧
  • 利用枚举类型实现统计
  • Educational Codeforces Round 9
  • 游戏坦克大战 说明(待续。。。)
  • json.dumps loads 终于区分出来了
  • js自己初探究
  • 从Sql server 2008获取表字段属性信息,注释信息
  • 定制UITabBar显示样式
  • C实现的静态顺序表
  • 053(三十二)
  • cacti (不可以利用yum安装cacti的配置)
  • 判断一个字符串是否为另外一个字符串旋转之后的字符串。
  • 30秒的PHP代码片段(1)数组 - Array
  • CentOS从零开始部署Nodejs项目
  • C语言笔记(第一章:C语言编程)
  • ES10 特性的完整指南
  • GraphQL学习过程应该是这样的
  • mysql中InnoDB引擎中页的概念
  • ng6--错误信息小结(持续更新)
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 记录一下第一次使用npm
  • 类orAPI - 收藏集 - 掘金
  • 入口文件开始,分析Vue源码实现
  • 智能合约Solidity教程-事件和日志(一)
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (12)Linux 常见的三种进程状态
  • (3)nginx 配置(nginx.conf)
  • (3)STL算法之搜索
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (windows2012共享文件夹和防火墙设置
  • (ZT)薛涌:谈贫说富
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十八)SpringBoot之发送QQ邮件
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)shell调试方法
  • (转)程序员疫苗:代码注入
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .aanva
  • .apk文件,IIS不支持下载解决
  • .NET 使用配置文件
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • :中兴通讯为何成功