Lombok使用介绍
1. Lombok介绍及优点
在Java中,封装是一个非常好的机制,最常见的封装莫过于get,set方法了,无论是Intellij idea 还是Eclipse,都提供了快速生成get,set方法的快捷键,使用起来很是方便,其实,我们还有更方便的办法,就是今天的主角-Lombok。 Lombok是一个通过简单注解来精简代码达到消除冗余代码的目的,如通过注解的方式减少get,set方法,构造方法等。
优点:1)提高编码效率
2)使代码更简洁
3)消除冗余代码
4)避免修改字段名字时忘记修改方法名
注:IDE上必须要支持Lombok,否则IDE会报错
2. Lombok原理
说到 Lombok,我们就得提到 JSR 269: Pluggable Annotation Processing API (https://www.jcp.org/en/jsr/detail?id=269) 。自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用(javac是编译时)。Lombok实现了“JSR 269 API”,那么在编译源文件的时候就将源代码改变了。
javac在编译源码的具体流程如下:
首先是写好的源代码Source File,然后javac首先会对源代码进行一个分析,生成一棵抽象语法树(AST),接下来就是Annotation Processing(注解处理),在注解处理的过程中就调用了 实现了“JSR 269 API”规范的Lombok程序(Lombok Annotation Processor Lombok注解处理器),这时Lombok就会对刚生成的AST进行处理,处理过程是:例如我们有一个@Data注解(@Data注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用),Lombok Annotation Handler就负责找到@Data注解所在的类对应的语法树(AST),然后修改该AST(Modified AST),修改的主要内容就是在里面增加了 Getter、Setter等方法定义的相应树节点,然后Lombok Annotation Processor输出一个修改后的AST。javac拿到修改后的AST进行一个解析和生成,这个时候就生成了字节码文件。
3. Lombok引入到项目中
引入Lombok的方式有两种:
1)通过向lib文件夹中添加lombok.jar包即可
2)如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
4. IDEA/Eclipse安装Lombok插件
1) IDEA 安装Lombok插件
2) Eclipse安装Lombok插件
首先需要手动下载 lombok-1.16.18.jar (可直接在官网下载),然后双击运行该jar,选择自己的Eclipse,然后点击Install/Update进行安装
提示如下信息,则说明安装插件成功
在mac或Linux下,可能会由于权限问题导致安装失败,如下:
这个时候只需要按照提示,用sudo权限执行该jar即可。
5. Lombok实战
Lombok一些常用及关键的注解:
- @Data 该注解使用在类上,该注解是最常用的注解,它结合了@ToString,@EqualsAndHashCode, @Getter和@Setter,但是不包含全参构造和无参构造。
- @Getter和@Setter 用在属性上,自动生成getter和setter方法,还可以指定访问范围,如:@Getter(AccessLevel.PROTECTED)表示生成的getter方法的权限是Protected的,如果不加AccessLevel的话,默认是public的。
-
@NoArgsConstructor 该注解使用在类上,该注解提供一个无参构造
-
@AllArgsConstructor 该注解使用在类上,该注解提供一个全参数的构造方法,默认不提供无参构造。
-
@toString 该注解使用在类上,该注解默认生成任何非讲台字段以名称-值的形式输出。如果需要可以通过注释参数
includeFieldNames
来控制输出中是否包含的属性名称。 可以通过exclude
参数中包含字段名称,可以从生成的方法中排除特定字段,如@ToString(exclude=”id”)排除id属性;@ToString(exclude={“column1”,“column2”})排除两个字段;@ToString(of=”id”)或@ToString(of={“column1”,“column2”})表示只要指定的字段。 可以通过callSuper
参数控制父类的输出,如:@ToString(callSuper=true, includeFieldNames=true)。 -
@EqualsAndHashCode 该注解使用在类上,该注解在类级别注释会同时生成
equals
和hashCode
。也可以使用exclude排除某些字段不加入到重写equals和hashcode方法当中,如:@EqualsAndHashCode(exclude=”id”)排除id属性,跟@toString的一些参数是一样的。 -
log 注解在 类 上。有如下可选择可用:
//@CommonsLog
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
//@JBossLog
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
//@Log
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
//@Log4j
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
//@Log4j2
private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
//@Slf4j
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
//@XSlf4j
private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
6. 反编译大法
Java的反编译工具Java Decompiler,官网 http://jd.benow.ca/,下载反编译工具或IDE的插件。可以通过反编译工具反编译.class文件来验证Lombok自动生成的代码。
7. Lombok工作中需要注意的点
1)在类需要序列化、反序列化时详细控制字段时,例如:Jackson json序列化,当某些字段为空时,可能会控制在序列化的时候相应的key也不显示。这个时候就需要考虑是否使用Lombok。
2)使用Lombok虽然能够省去手动创建Getter和Setter等方法,但是却降低了源代码文件的可读性和完整性,降低了阅读源代码的舒适度。
3)使用@Slf4j还是@Log4j要根据项目所使用的日志框架来决定。
4)选择合适的地方来使用Lombok,例如POJO是一个好地方,POJO很单纯。