1、介绍
Lombok官网:https://projectlombok.org
lombok其实就是帮助我们编写getter或者equals方法的一个“工具”。
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
2、使用LomBok的两点主要原因
- 简化冗余的JavaBean代码;
- 提高JavaBean中方法的执行效率;
Lombok也提供了对打印日志的处理。
在使用Lombok以后就会大大减少项目中的代码量,
同时由于Lombok有自动修改的功能,也提高了项目中代码的执行效率。
没使用lombok的Javabean
使用了lombok的javabean
3、导入
(1)导入依赖
(2)Intellij IDEA 安装 lombok 插件
Intelij IDEA 支持 lombok 插件 , 如你的idea 不支持, 请更新 较高版本 2017 及以上, 其他Ide类同;
添加进去以后点击import change,等待Idea把jar包下载完就可以在项目中使用了。
使用详解
想要使用Lombok就需要删除在项目中(JavaBean)存在的已经生成的getter方法setter方法以及equals和hash方法
4、Lombok注解详解
Lombok主要常用的注解有:@Data,@getter,@setter,@NoArgsConstructor,@AllArgsConstructor,@ToString,@EqualsAndHashCode,@Slf4j,@Log4j。
@Slf4j:在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@Data注解:在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor、toString 注解,即当使用当前注解时,会自动生成包含的所有方法;
@getter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;
@setter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;
@NoArgsConstructor注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法;
@AllArgsConstructor注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的有参构造方法;
@EqualsAndHashCode注解:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;
@Log4j:在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可;
@ToString注解:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法;
在使用以上注解需要处理参数时,处理方法如下(以@ToString注解为例,其他注解同@ToString注解):
@ToString(exclude=“column”)
意义:排除column列所对应的元素,即在生成toString方法时不包含column参数;
@ToString(exclude={“column1”,“column2”})
意义:排除多个column列所对应的元素,其中间用英文状态下的逗号进行分割,即在生成toString方法时不包含多个column参数;
@ToString(of=“column”)
意义:只生成包含column列所对应的元素的参数的toString方法,即在生成toString方法时只包含column参数;
@ToString(of={“column1”,“column2”})
意义:只生成包含多个column列所对应的元素的参数的toString方法,其中间用英文状态下的逗号进行分割,即在生成toString方法时只包含多个column参数;
5、Lombok工作原理分析
在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码。自动生成的代码到底是如何产生的呢?
——其核心之处就是对于注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。
(1)运行时解析
运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。java.lang,reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,对反射熟悉的朋友应该都会很熟悉这种解析方式
(2)编译时解析
编译时解析有两种机制:
——Annotation Processing Tool
——Pluggable Annotation Processing API
Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:
1、javac对源代码进行分析,生成了一棵抽象语法树(AST)
2、运行过程中调用实现了“JSR 269 API”的Lombok程序
3、此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
4、javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)
6、Lombok的优缺点
优点:
能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
不支持多种参数构造器的重载
虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度