java中cleanup的使用_Lombok介绍及使用方法

1. lombok简介

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

2. 安装

2.1 Maven添加依赖,lombok也就是一个普通的jar包

org.projectlombok

lombok

1.16.14

provided

2.2 eclipse安装

1.从官网下载lombok.jar,放入到eclipse所在安装目录(也可以放到其他目录,不过不能出现中文路径):

b7094a0f6ebe

eclipse根目录

2.修改eclipse.ini文件,在配置尾部追加一条(根据每个人的实际路径自行修改)

-javaagent:D:\Program Files (x86)\eclipse-jee-neon-1a-win32-x86_64\eclipse\lombok.jar

b7094a0f6ebe

eclipse.ini

重启eclipse,lombok即可生效

2.3 Intellij idea安装

idea中开发的话需要安装Lombok plugin,同时设置 Setting -> Compiler -> Annotation Processors -> Enable annotation processing勾选。

b7094a0f6ebe

lombok plugin

3. lombok使用

3.1 @NonNull: 可以帮助我们避免空指针。

package io.fredia.femicro.gate.ratelimit.config;

import io.micrometer.core.lang.NonNull;

/**

* LombokDemo

*

* @author : Fredia

* @since : 2018年4月11日

* @version : v1.0.0

*/

public class LombokDemoClass {

public void NonNullDemo(@NonNull Object obj) {

}

}

3.2 @Cleanup: 自动帮我们调用close()方法。

package io.fredia.femicro.gate.ratelimit.config;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import lombok.Cleanup;

/**

* LombokDemo

*

* @author : Fredia

* @since : 2018年4月11日

* @version : v1.0.0

*/

public class LombokDemoClass {

public static void main(String[] args) throws IOException {

@Cleanup

InputStream in = new FileInputStream(args[0]);

@Cleanup

OutputStream out = new FileOutputStream(args[1]);

byte[] b = new byte[10000];

while (true) {

int r = in.read(b);

if (r == -1)

break;

out.write(b, 0, r);

}

}

}

我们都知道io操作完必须关闭,所以此注解帮我们完成了如下的操作。

in.close();

out.close();

3.3 @Getter / @Setter: 自动生成Getter/Setter方法

package io.fredia.femicro.gate.ratelimit.config;

import java.util.Date;

import lombok.Getter;

import lombok.Setter;

/**

* LombokDemo

*

* @author : Fredia

* @since : 2018年4月11日

* @version : v1.0.0

*/

public class LombokDemo {

@Getter

@Setter

private String key;

@Getter

@Setter

private Date expiration;

}

3.4 @NoArgsConstructor: 自动生成无参数构造函数。

import lombok.NoArgsConstructor;

/**

* LombokDemo

*

* @author : Fredia

* @since : 2018年4月11日

* @version : v1.0.0

*/

@NoArgsConstructor

public class LombokDemo {

private String key;

private Long remaining;

private Long reset;

private Date expiration;

public static void main(String[] args) {

LombokDemo lom2 = new LombokDemo();

}

}

3.5 @AllArgsConstructor: 自动生成全参数构造函数。

import lombok.AllArgsConstructor;

/**

* LombokDemo

*

* @author : Fredia

* @since : 2018年4月11日

* @version : v1.0.0

*/

@AllArgsConstructor

public class LombokDemo {

private String key;

private Long remaining;

private Long reset;

private Date expiration;

public static void main(String[] args) {

LombokDemo lom = new LombokDemo(key, remaining, reset, expiration);

}

}

3.6 @Data: 自动为所有字段添加@ToString, @EqualsAndHashCode, @Getter方法,为非final字段添加@Setter,和@RequiredArgsConstructor@RequiredArgsConstructor

import java.util.Date;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

/**

* LombokDemo

*

* @author : Fredia

* @since : 2018年4月11日

* @version : v1.0.0

*/

@Data

@NoArgsConstructor

@AllArgsConstructor

public class LombokDemo {

private String key;

private Long remaining;

private Long reset;

private Date expiration;

}

b7094a0f6ebe

验证

4. lombok实现原理分析

接下来进行lombok能够工作的原理分析,以Oracle的javac编译工具为例。

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

举例来说,现在有一个实现了”JSR 269 API”的程序A,那么使用javac编译源码的时候具体流程如下:

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

运行过程中调用实现了”JSR 269 API”的A程序

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

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

所以lombok本质上就是这样的一个实现了”JSR 269 API”的程序。在使用javac的过程中,结合官方说明,它编译的流程如下:

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

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

此时lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点

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

5. 总结

lombok的实现:就是元注解出现后注解运行生命周期里面的编译周期,这个就是 JSR 269 Pluggable Annotation Processing API,就是源代码在编译成字节码的时候修改了语法树的节点规则进行了加强生成,

以后可以更加快捷的敲代码了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值