Android LomBok的使用

Android LomBok的使用

八归少年 3,011 2020-01-17

Lombok

  • Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为您的Java增光添彩。永远不要再写另一个getter或equals方法,带有一个注释的您的类有一个功能全面的生成器,自动化您的日志记录变量等等。通过使用对应的注解,可以在编译源码的时候生成对应的方法,减少模板代码的编写,极大提升开发效率。

GitHub地址:https://projectlombok.org

依赖

implementation 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'

lombok插件

  • 安装lombok插件主要是为了使用lombok过程中代码的get,set等方法报红,不是代码错误。
  • 在Setting->Plugins中输入lombok——>添加插件Lombok——>点击安装。

常用注解

@Data 注解在类上;提供类所有属性的 getter 和 setter 方法,此外还提供了equals、hashCode、toString 方法
@Setter :注解在属性上;为属性提供 setter 方法
@Getter :注解在属性上;为属性提供 getter 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
@Cleanup : 可以关闭流
@Builder : 被注解的类加个构造者模式
@Synchronized : 加个同步锁
@SneakyThrows : 等同于try/catch 捕获异常
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
@toString:注解在类上;为类提供toString方法(可以添加排除和依赖);

代码示例

@Builder
@Data
@AllArgsConstructor
@EqualsAndHashCode
@ToString(callSuper=true,exclude="username")
//@ToString(exclude = {"id","name"})   用exclude 决定排除哪些参数
//@ToString(callSuper = true)  决定调用父类同名方法
public class LoginBean {
    private String username;
    private String password;
    private String uuid;
    private String captcha;
}
LoginBean.builder()
        .username(loginUsername.getText().toString())
        .password(loginPassword.getText().toString())
        .uuid(code)
        .captcha(loginCode.getText().toString()).build(),
@Cleanup
InputStream in = new FileInputStream("2");
@Cleanup
OutputStream out = new FileOutputStream("2");
byte[] b = new byte[10000];        while(true)

{
    int r = in.read(b);
    if (r == -1) break;
    out.write(b, 0, r);
}
private void initModel(@NonNull String params) {  
      params.equals("1");  
 }

工作原理

  • 会发现在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码。自动生成的代码到底是如何产生的呢?
  • 核心之处就是对于注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。
运行时解析

运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。java.lang,reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,对反射熟悉的朋友应该都会很熟悉这种解析方式。

编译时解析
  • 编译时解析有两种机制,分别简单描述下:

1.Annotation Processing Tool
apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:

  • api都在com.sun.mirror非标准包下
  • 没有集成到javac中,需要额外运行

2.Pluggable Annotation Processing API
JSR 269自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该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)生成字节码文件,即给class增加新的节点(代码块)

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.yanghujun.com/archives/lombok