java 代码简化插件——Lombok
1.概念
a.简介:Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法
b.作用:Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些
c.原理:
1)javac对源代码进行分析,生成了一棵抽象语法树(AST)
2)运行过程中调用实现了“JSR 269 API”的Lombok程序
3)此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
4)javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)
2.安装插件
a.在IDEA的Settings - Plugins中搜索 "lombok",Install安装lombok插件
3.使用
a.导入maven依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency>
b.创建Entity实体类
@Getter //get方法 @Setter //set方法 @NoArgsConstructor //无参构造 @AllArgsConstructor //全参构造 @RequiredArgsConstructor(staticName = "of") //会生成一个包含常量,和标识了NotNull的变量的构造方法。生成的构造方法是私有的private @ToString //重写toString方法 @EqualsAndHashCode //重写equals方法和hashCode方法 public class Cmdty { @NonNull private String id; @NonNull private int cmdtyCode; private String cmdtyName; private long price; }
c.测试
public static void main( String[] args ) { String id = UUID.randomUUID().toString().replaceAll("-",""); int cmdtyCode = 10001; String cmdtyName = "商品1"; long price = 100; //测试Constructor全参构造@AllArgs Cmdty cmdty1 = new Cmdty(id, cmdtyCode, cmdtyName, price); //测试get方法@Getter System.out.println("Cmdty: id[" + cmdty1.getId() + "], cmdtyCode[" + cmdty1.getCmdtyCode() + "], cmdtyName[" + cmdty1.getCmdtyName() + "], price[" + cmdty1.getPrice() + "]"); //测试Constructor指定参数自定义构造@RequiredArgsConstructor(staticName = "of") Cmdty cmdty2 = Cmdty.of(id, cmdtyCode); //测试重写toString方法@ToString System.out.println(cmdty2.toString()); //测试重写equals方法和hashCode方法@EqualsAndHashCode System.out.println(cmdty1.equals(cmdty2)); System.out.println("hashCode: cmdty1[" + cmdty1.hashCode() + "], cmdty2[" + cmdty2.hashCode() + "]"); //测试set方法@Setter cmdty2.setCmdtyName(cmdtyName); cmdty2.setPrice(price); //测试重写equals方法和hashCode方法@EqualsAndHashCode System.out.println(cmdty1.equals(cmdty2)); System.out.println("hashCode: cmdty1[" + cmdty1.hashCode() + "], cmdty2[" + cmdty2.hashCode() + "]"); }