摘要
在我们日常码代码时经常会写很多重复且没有技术含量的代码,例如vo中property的get、set方法,构造函数,log的初始化等。lombok主要是以简单的注解形式来简化一些没有技术含量并且又不得不写的代码,提高了代码的简洁性。
用法
-
添加依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
-
IDEA安装lombok插件
settings/plugins搜索lombok插件并安装
使用
-
@Data
注解在类上,为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法@Data public class User { private String name; private String sex; }
-
@Getter/@Setter
注解在类或字段上面,就是生成 get 和 set 方法 -
@ToString
注解在类上面,生成 toString 方法 -
@EqualsAndHashCode
注解在类上面,生成 hashCode 和 equals 方法 -
@NoArgsConstructor
注解在类,生成无参的构造方法
相当于如下代码public class User { private String name; private Integer sex; public User() { } }
-
@RequiredArgsConstructor
注解在类上,生成包含final和@NonNull注解的成员变量的构造器
相当于如下代码public class User { private String name; private final Integer sex; public User(final Integer sex) { this.sex = sex; } }
-
@AllArgsConstructor
注解在类,生成包含类中所有字段的构造方法
相当于如下代码public class User { private String name; private final Integer sex; public User(final String name, final Integer sex) { this.name = name; this.sex = sex; } }
-
@Slf4j
这个也是用的比较多的,注解在类上,生成log常量
相当于如下代码public class User { private static final Logger log = LoggerFactory.getLogger(User.class); private String name; private Integer sex; }
-
@NonNull
在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针public class NonNullExample { private String name; public NonNullExample(@NonNull User user) { super("Hello"); this.name = user.getName(); } }
-
@Cleanup
帮助我们自动调用close()方法,很大的简化了代码public class CleanupExample { 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); } } }
-
@Accessors
用于配置getter和setter方法的生成结果,有三个属性fluent
getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象。如下@Data @Accessors(fluent = true) public class User { private Long id; private String name; // 生成的getter和setter方法如下,方法体略 public Long id() {} public User id(Long id) {} public String name() {} public User name(String name) {} }
chain
setter方法返回当前对象。如下@Data @Accessors(chain = true) public class User { private Long id; private String name; // 生成的setter方法如下,方法体略 public User setId(Long id) {} public User setName(String name) {} }
prefix
用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。如下@Data @Accessors(prefix = "p") class User { private Long pId; private String pName; // 生成的getter和setter方法如下,方法体略 public Long getId() {} public void setId(Long id) {} public String getName() {} public void setName(String name) {} }
原理
Lombok依靠可插件化的Java自定义注解处理API(JSR 269: Pluggable Annotation Processing API)在Javac编译阶段利用“Annotation Processor”对自定义的注解进行预处理后生成真正在JVM上面执行的“Class文件”。
在Javac 解析成AST抽象语法树之后, Lombok 根据自己编写的注解处理器,动态地修改 AST,增加新的节点(即Lombok自定义注解所需要生成的代码),最终通过分析生成JVM可执行的字节码Class文件
总结
优点
- 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率。
- 让代码变得简洁,不用过多的去关注相应的方法。
- 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等。
缺点
- 不支持多种参数构造器的重载。
- 虽然代码变得简洁,但也大大降低了代码的可读性和完整性。