近来偶遇一款撸码神器,介绍给你们~
相信许多小伙伴都深有体会,POJO类中的千篇一概的getter/setter,constructor等方法让人写的揪心,那么今天就有一种方法能够残暴的解决这个问题。
接下来为你们介绍这款神器:Lombok
如下是官方对Lombok的介绍java
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Project Lombok是一个java库,它能够自动插入编辑器和构建工具,为java增色。永远不要再编写另外一个getter或equals方法,使用一个注释,您的类就有了一个功能齐全的构建器、自动记录变量等等。
简而言之,Lombok实现的效果就是经过简单的注解来精简代码达到消除冗长代码的目的。git
对Lombok有了一个基本的认识以后,让咱们来挖掘一下它的优缺点。首先看一下它的优势。github
以上就是Lombok的优势,固然,Lombok的优势远远不止以上几点,使用Lombok,你能够更加优雅高效的编辑代码。但,俗话说“有利必有弊”,Lombok为咱们带来便利的同时也带来的很多小麻烦。eclipse
虽然Lombok有着很多缺点,但总归是利大于弊,做为一款优秀的神器,仍然值得咱们去学习。编辑器
授人以鱼不如授人以渔,接下来简要介绍一下Lombok的原理。ide
Sun公司在2005.2.1提交了JSR 269,用于支持在编译期对annotation进行处理,即引入了插入式注解处理API(Pluggable Annotation Processing API)。javac从java6开始支持“JSR 269 API”规范,只要程序实现了该API,就能在javac运行的时候获得调用,而Lombok实现了“JSR 269 API”,在编译时,javac编译源码的具体流程以下:Source File -> Parse -> AST -> Annotation Processing -> Modified AST -> Analyze and Generate -> Byte Code
在项目中引入Lombok的方法有不少,在此以Maven为例进行讲解,其余途径能够参考官方网站https://projectlombok.org/
。
打开pom.xml文件,添加如下依赖。工具
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency>
在上面提到,Lombok须要额外的环境配置,此处以IDEA为例进行讲解。学习
File -> Settings -> Plugins
,输入Lombok Plugin
点击搜索。完成了上述准备以后,就能够愉快的使用Lombok进行编码了。编码以前首先为你们介绍一下Lombok的基本用法。网站
@Data
包含了 @Getter @Setter @ToString @EqualsAndHashCode
即自动为类生成全部getter、setter、toString、eaquals以及hashCode方法@Getter 为全部属性生成public修饰的get方法
@Getter(AccessLevel.PROTECTED) 为全部属性生成protected修饰的get方法ui@Setter 为全部属性生成public修饰的set方法
@Setter(AccessLevel.PROTECTED) 为全部属性生成protected修饰的set方法@NoArgsConstructor 无参构造器
@AllArgsConstructor 生成带有全部属性的有参构造器@ToString 默认生成带有全部属性的toString方法
@ToString(exclude = "column") 生成除column
属性以外的全部属性的toString方法
@ToString(exclude = {"column1", "column2"})
@ToString(of = "column") 生成只有column
属性的toString方法
@ToString(of = {"column1", "column2"})@EqualsAndHashCode
@EqualsAndHashCode(exclude = "column") 以column
属性以外的属性做为是不是相同对象判断的标准
@EqualsAndHashCode(of = "column")) 只以column
属性做为是不是相同对象判断的标准@Slf4j 为当前类生成日志对象
@Log4j 为当前类生成日志对象
接下来让咱们简单对比一下代码。
首先是未经简化的代码。
public class User { private Integer id; private String username; private String password; private String email; private String phone; public User(Integer id, String username, String password, String email, String phone) { this.id = id; this.username = username; this.password = password; this.email = email; this.phone = phone; } public User() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && Objects.equals(password, user.password) && Objects.equals(email, user.email) && Objects.equals(phone, user.phone); } @Override public int hashCode() { return Objects.hash(id, username, password, email, phone, question, answer, role, createTime, updateTime); } }
接下来是使用Lombok简化后的代码。
@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class User { private Integer id; private String username; private String password; private String email; private String phone; }
Lombok的更多用法,在此再也不赘述,等待你们去慢慢发掘。
Lombok虽然好用,但推荐你们选择适合的地方使用Lombok,例如POJO是一个好地方,由于POJO很单纯。
若是有小伙伴想要深究Lombok是如何实现插入式注解的,能够利用反编译大法查看源码。
在此推荐另外一款神兵利器 Java Decompiler
。
官方网站为:http://java-decompiler.github.io/
有如下三种安装方式:
安装完成后能够经过Java Decompiler验证Class文件。