请选择 进入手机版 | 继续访问电脑版
 找回密码
 中文注册

QQ登录

只需一步,快速开始

Java开辟黑科技LomBok

0
回复
573
查看
[ 复制链接 ]

10

主题

10

帖子

14

积分

小酷一级

Rank: 1

积分
14
2019-4-13 23:41:45 显示全部楼层 阅读模式
在面向对象编程中必不可少必要在代码中界说对象模子,而在基于Java的业务平台开辟实践中尤其云云。信赖各人在平常开辟中也深有感触,原来是没有多少代码开辟量的,但是由于界说的业务模子对象比力多,而必要重复写Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等。那么是否一款插件或工具可以或许替各人完成这些繁琐的操纵呢?本文将向各人先容一款在Eclipse/Intellij IDEA主流的开辟情况中都可以利用的Java开辟神器,同时扼要地先容下其背后自界说注解的原理。
Lombok的简介
Lombok是一款Java开辟插件,使得Java开辟者可以通过其界说的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简朴的Java模子对象(POJO)。在开辟情况中利用Lombok插件后,Java开辟职员可以节流出重复构建,诸如hashCode和equals如许的方法以及各种业务对象模子的accessor和ToString等方法的大量时间。对于这些方法,它可以或许在编译源代码期间主动帮我们天生这些方法,并没有如反射那样低落步伐的性能。
在Intellij中安装Lombok的插件
想要体验一把Lombok的话,得先在本身的开辟情况中安装上对应的插件。下面先为各人展示下如安在Intellij中安装上Lombok插件。
通过IntelliJ的插件中央探求Lombok
A0sae8IBbEIbkG3G.jpg

从Intellij插件中央安装Lombok
kYy7ygE7jE66E6Zm.jpg

别的必要留意的是,在利用lombok注解的时间记得要导入lombok.jar包到工程,假如利用的是Maven的工程项目标话,要在其pom.xml中添加依靠如下:

org.projectlombok
lombok
1.16.8

好了,就这么几步后就可以在Java工程中开始用Lombok这款开辟神器了。下文将会给各人先容Lombok中一些注解的利用方法,让各人对怎样用这些注解有一个大抵的相识。
Lombok注解利用方法
Lombok常用注解先容
下面先来看下Lombok中重要几个常用注解先容:
AaWq62CCjjh44449.jpg

Lombok的根本利用示例
(1)Val可以将变量说明是final范例。
public static void main(String args) {
val setVar = new HashSet;
val listsVar = new ArrayList;
val mapVar = new HashMap;
//=>上面代码相称于如下:
final Set setVar2 = new HashSet;
final List listsVar2 = new ArrayList;
final Map maps2 = new HashMap;
}
(2)@NonNull注解可以或许为方法或构造函数的参数提供非空查抄。
public void notNullExample(@NonNull String string) {
string.length;
}
//=>相称于
public void notNullExample(String string) {
if (string != null) {
string.length;
} else {
throw new NullPointerException("null");
}
}
(3)@Cleanup注解可以或许主动开释资源。
uGePGB7GhtgeEbXf.jpg

(4) @Getter/@Setter注解可以针对类的属性字段主动天生Get/Set方法。
SoTrDg8T6TOfTsFG.jpg

(5)@ToString注解,为利用该注解的类天生一个toString方法,默认的toString格式为:ClassName(fieldName= fieleValue ,fieldName1=fieleValue)。
@ToString(callSuper=true,exclude="someExcludedField")
public class Demo extends Bar {
private boolean someBoolean = true;
private String someStringField;
private float someExcludedField;
}
//上面代码相称于如下:
public class Demo extends Bar {
private boolean someBoolean = true;
private String someStringField;
private float someExcludedField;
@ Override
public String toString {
return "Foo(super=" + super.toString +
", someBoolean=" + someBoolean +
", someStringField=" + someStringField + ")";
}
}
(6) @EqualsAndHashCode注解,为利用该注解的类主动天生equals和hashCode方法。
JRz4mMPAmpdB6B4S.jpg

(7)@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor,这几个注解分别为类主动天生了无参构造器、指定参数的构造器和包罗全部参数的构造器
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample {
private int x, y;
@NonNull private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
}
//上面代码相称于如下:
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample {
private int x, y;
@NonNull private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
}
public class ConstructorExample {
private int x, y;
@NonNull private T description;
private ConstructorExample(T description) {
if (description == null) throw new NullPointerException("description");
this.description = description;
}
public static  ConstructorExample of(T description) {
return new ConstructorExample(description);
}
@java.beans.ConstructorProperties({"x", "y", "description"})
protected ConstructorExample(int x, int y, T description) {
if (description == null) throw new NullPointerException("description");
this.x = x;
this.y = y;
this.description = description;
}
public static class NoArgsExample {
@NonNull private String field;
public NoArgsExample {
}
}
}
(8) @Data注解作用比力全,其包罗注解的聚集 @ToString, @EqualsAndHashCode,全部字段的 @Getter和全部非final字段的 @Setter, @RequiredArgsConstructor。其示例代码可以参考上面几个注解的组合。
(9) @Builder注解提供了一种比力推许的构建值对象的方式。
(10) @Synchronized注解雷同Java中的Synchronized 关键字,但是可以隐蔽同步锁。
public class SynchronizedExample {
private final Object readLock = new Object;
@Synchronized
public static void hello {
System.out.println("world");
}
@Synchronized("readLock")
public void foo {
System.out.println("bar");
}
//上面代码相称于如下:
public class SynchronizedExample {
private static final Object $LOCK = new Object[0];
private final Object readLock = new Object;
public static void hello {
synchronized($LOCK) {
System.out.println("world");
}
}
public void foo {
synchronized(readLock) {
System.out.println("bar");
}
}
}
Lombok背后的自界说注解原理
本文在前三章节重要先容了Lombok这款Java开辟利器中各种界说注解的利用方法,但作为一个Java开辟者来说光相识插件大概技能框架的用法只是做到了“知其然而不知其以是然”,假如真正把握其背后的技能原理,看明确源码计划理念才气真正做到“知其然知其以是然”。好了,话不多说下面进入本章节的正题,看下Lombok背后注解的深入原理。
大概认识Java自界说注解的同砚已经猜到,Lombok这款插件正是依赖可插件化的Java自界说注解处置惩罚API(JSR 269: Pluggable Annotation Processing API)来实如今Javac编译阶段使用“Annotation Processor”对自界说的注解举行预处置惩罚后天生真正在JVM上面实行的“Class文件”。有爱好的同砚反编译带有Lombok注解的类文件也就一览无余了。其大抵实行原理图如下:
wn8s1T5q1s6YwRu9.jpg

从上面的这个原理图上可以看出Annotation Processing是编译器在剖析Java源代码和天生Class文件之间的一个步调。此中Lombok插件详细的实行流程如下:
ZZk5Di9k0z23d5i0.jpg

从上面的Lombok实行的流程图中可以看出,在Javac 剖析成AST抽象语法树之后, Lombok 根据本身编写的注解处置惩罚器,动态地修改 AST,增长新的节点(即Lombok自界说注解所必要天生的代码),终极通太过析天生JVM可实行的字节码Class文件。利用Annotation Processing自界说注解是在编译阶段举行修改,而JDK的反射技能是在运行时动态修改,两者相比,反射固然更加机动一些但是带来的性能消耗更加大。
必要更加深入明白Lombok插件的细节,本身查阅其源代码是必比可少的。对开源框架代码比力有执着寻求的童鞋可以将Lombok的源代码工程从github上download到当地举行阅读和本身调试。下图为Lombok工程源代码的截图:
SnSKm3KLsSlk6n0t.jpg

从认识JSR 269: Pluggable Annotation Processing API的同砚可以从工程类布局图中发现AnnotationProcessor这个类是Lombok自界说注解处置惩罚的入口。该类有两个比力紧张的方法一个是init方法,别的一个是process方法。在init方法中,先用来做参数的初始化,将AnnotationProcessor类中界说的内部类(JavacDescriptor、EcjDescriptor)先注册到ProcessorDescriptor范例界说的列表中。此中,内部静态类—JavacDescriptor在其加载的时间就将 lombok.javac.apt.LombokProcessor这个类举行对象实例化并注册。
在 LombokProcessor处置惩罚器中,此中的process方法会根据优先级来分别运行相应的handler处置惩罚类。Lombok中的多个自界说注解都分别有对应的handler处置惩罚类,如下图所示:
XeDiKQnDuDiUdRMs.jpg

可以看出,在Lombok中对于其自界说注解举行现实的更换、修改和处置惩罚的正是这些handler类。对于实在现的细节可以详细参考此中的代码。
视频教程:http://www.wkcto.com/course/103?zh95 各人可以参考来学

酷微米 - 社区版权 - 免责声明1、根据二○一三年一月三十日《计算机软件保护条例》2次修订第17条规定
2、为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件;
3、可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!
4、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
5、本站所有主题由该帖子作者发表,该帖子作者与酷微米享有帖子相关版权
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和酷微米的同意
7、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
8、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
9、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
10、酷微米管理员和版主有权不事先通知发贴者而删除本文
--- 特别提示:本站资源非代理用户严禁传播倒卖,不遵守规定者,酷微米有权封号而不作另行通知! ---

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文注册

本版积分规则

HOT • 推荐
酷微米 你我共享 为兴趣而生,全网资源一网打尽。 立即登录 中文注册
发布主题 快速回复 收藏帖子 返回列表 官方QQ群