lombok介绍
lombok提供通过注解来创建代码,以达到避免编写样板代码,简约代码的目的,特别对于POJO类,效果显著,而且可以规避一些代码检查工具的检查(在公司内很有用)。
特性介绍
val关键字:
修饰final的局部变量,duck type风格public String example() { val example = new ArrayList(); example.add("Hello, World!"); val foo = example.get(0); return foo.toLowerCase(); }
注解:
参考 lombok全特性- @NonNull:修饰方法参数/成员变量,如果入参为空,则抛出NPE
- @Cleanup:修饰函数中Closable类的实例,自动添加try-finally,执行close
- @Getter/@Setter:修饰类/成员变量,提供get/set方法
- @ToString:修饰类,重写toString()
- @EqualsAndHashCode:根据类的成员变量生成equal和hashCode()
- @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:创建构造函数
- @Data:@ToString, @EqualsAndHashCode, @Getter @Setter @RequiredArgsConstructor 组合
- @Value:修饰类,让类的实例不可通过引用修改内部成员,具备Immutable特性
- @Builder:修饰类,会生成static的内部类Builder,使用Builder模式
- @SneakyThrows:修饰方法,生成try-catch,并抛出非运行异常
- @Synchronized:修饰方法,同步代码
- @Getter(lazy=true):修饰变量,对变量生成双重检测的get代码
- @Log:修饰类,给类生成一个log的成员变量
lombok实现原理
lombok利用了JDK6的新特性:JSR-000269 Pluggable Annotation Processing API(插入式注解API)。
Javac在编译过程变成:
1. 先对源码分析,生成一棵抽象语法树,
2. 再不断调用实现了JAR 269 API的程序,根据注解修改了抽象语法树,直到语法树不再被修改为止
3. javac根据修改后的抽象语法树生成.class字节码
lombok使用
IDEA lombok插件安装
Demo介绍
通过IDEA创建一个maven-archetype-quickstart的Maven工程。
添加lombok依赖,由于使用Log注解,加上Slf4j依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version> 1.16.18</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
App代码如下:
import lombok.Builder;
import lombok.Data;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class App
{
public static void main( String[] args ){
Person person;
try {
person = Person.builder().age(10).build();
}catch (NullPointerException e){
log.error(e.getMessage());
}
person = Person.builder().age(10).name("foo").build();
log.info(person.toString());
}
@Data
@Builder
public static class Person{
@NonNull private String name;
private int age;
}
}
输出如下:
[main] ERROR edu.fate.App - name
[main] INFO edu.fate.App - App.Person(name=foo, age=10)
Demo中使用的都是常用的注解,其他注解不常用,并且使用时要谨慎并要理解原理。