Lombok使用及原理分析
2018-07-17 00:12:34

在 java平台上,lombok 提供了简单的注解的形式来帮助我们消除一些必须有但看起来很臃肿的代码, 比如属性的get/set,及对象的toString等方法,特别是相对于 POJO

1. 项目背景

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

2. 使用方法

2.1 在IDEA安装Lombok Plugin

打开IDEA的Settings面板,并选择Plugins选项,然后点击 “Browse repositories..”,在输入框输入”lombok”,得到搜索结果,选择第二个,点击安装,然后安装提示重启IDEA,安装成功;

2.2 添加Maven依赖

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

2.3 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.lombok;

import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;

@Data
public class Student {
String name;
int sex;
Integer age;
String address;
List<String> books;
}

2.4 Lombok注解

lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
Lombok 注解在线帮助文档:http://jnb.ociweb.com/jnb/jnbJan2010.html

下面介绍几个常用的 lombok 注解:

   @Data   :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、                hashCode、toString 方法
   @Setter:注解在属性上;为属性提供 setting 方法
   @Getter:注解在属性上;为属性提供 getting 方法
   @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
   @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
   @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

3. 原理分析

自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。

lombok本质上就是这样的一个实现了”JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:

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

4. 注意事项

  1. Intellij Idea配置的编译工具为Oracle javac的话,也就直接支持lombok了。
  2. Eclipse中使用的不是Oracle javac这个编译工具,而是自己实现的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得进行设置,具体是在Eclipse程序目录中的eclipse.ini文件中添加如下两行设置:
    -javaagent:[lombok.jar所在路径]
    -Xbootclasspath/a:[lombok.jar所在路径]

5. 参考文献

http://blog.csdn.net/u011299686/article/details/13772305

http://blog.csdn.net/hinstenyhisoka/article/details/50468271

http://blog.csdn.net/tanga842428/article/details/53426589

镜像地址

https://www.cnblogs.com/coderzhw/p/11094315.html

pay