点击上方 coder2plus 轻松关注公众号!及时获取有趣、有料的技术文章。


在面向对象编程中,必不可少的需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此。相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复写Getter/Setter、构造器方法、字符串输出的ToString方法、Equals/HashCode方法等。我们都知道Lombok能够替大家完成这些繁琐的操作,但是其背后的原理很少有人会关注或者说得清,本文会带着大家了解这一开发神器内部的运行机制与原理!

1. 简介

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一系列注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如HashCode和Equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,且并不会如反射那样降低程序的性能。

2. 使用方法

使用lombok项目的方法很简单,分为四个步骤:

  1. 安装插件,在编译类路径中加入lombok.jar包(具体安装方法可自己百度);

  2. 在需要简化的类或方法上,加上要使用的注解;

  3. 使用支持lombok的编译工具编译源代码(关于支持lombok的编译工具,见4.支持lombok的编译工具);

  4. 编译得到的字节码文件中自动生成Lombok注解对应的方法或代码;

3. 原理分析

接下来,我们进行lombok的原理分析,以Oracle的javac编译工具为例。自Java 6起,javac开始支持JSR 269 Pluggable Annotation Processing API规范,只要程序实现了该API,就能在java源码编译时调用定义的注解。举例来说,现在有一个实现了"JSR 269 API"的程序A,那么使用javac编译源码的时候具体流程如下:

  1. javac对源代码进行分析,生成一棵抽象语法树(AST);

  2. 运行过程中调用实现了"JSR 269 API"的A程序;

  3. 此时A程序就可以完成它自己的逻辑,包括修改第一步骤得到的抽象语法树(AST);

  4. javac使用修改后的抽象语法树(AST)生成字节码文件;

    详细的流程图如下:

Lombok原理就是这么简单!_第1张图片

从上面的Lombok执行的流程图中可以看出,在Javac 解析成AST抽象语法树之后, Lombok 根据自己编写的注解处理器,动态地修改 AST,增加新的节点(即Lombok自定义注解所需要生成的代码),最终通过分析生成JVM可执行的字节码Class文件。使用Annotation  Processing自定义注解是在编译阶段进行修改,而jdk的反射技术是在运行时动态修改,两者相比,反射虽然更加灵活一些但是带来的性能损耗更加大。Lombok本质上就是一个实现了JSR 269 API的程序,在使用javac的命令过程中,它生效的具体流程如下:

  1. javac对源代码进行分析,生成一棵抽象语法树(AST);

  2. 运行过程中调用实现了JSR 269 API的lombok程序;

  3. 编译机会调用lombok程序对第一步得到的AST进行处理,找到其注解所在类对应的语法树(AST),然后修改该语法树,增加注解对应的方法或代码片段到定义的相应树节点;

  4. javac使用修改后的抽象语法树生成最终的java字节码文件;

4. 支持lombok的编译工具

支持lombok的编译工具如下:

  1. 3.原理分析可知,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所在路径]

5. Lombok带来的问题

  1. 使用Lombok虽然能够省去手动创建setter和getter等方法的麻烦,但是却大大降低了源码的可读性和完整性,降低了阅读源代码的舒适度。

  2. 在有些IDE中,使用Lombok注解省略的方法在被调用时,会报找不到定义的错误,此种情况下,需要做些特殊处理,如Intellij Idea中,需要下载安装Lombok plugin插件;

本文微信公众号地址:Lombok原理就是这么简单!


如果你喜欢本文,欢迎点击右上角,把文章分享到朋友圈.....

Lombok原理就是这么简单!_第2张图片

关注coder2plus,获取技术干货、IT圈趣闻,公众号内私聊小编,可获得海量技术视频与书籍!

技术交流群,请加QQ群:1036992239Wechat:coder2plus

投稿、合作、版权等,请联系邮箱:[email protected]