Lombok是一个Java库,它通过注解来简化Java类的编写。它提供了一组注解,可以自动生成一些常见的Java代码,如getter和setter方法、构造函数、equals和hashCode方法等。
基本介绍
使用Lombok插件可以让开发者在集成开发环境(IDE)中更方便地使用Lombok。插件提供了对Lombok注解的支持,可以自动识别并处理这些注解,生成相应的代码。
官网如下:projectlombok.org/
install中是各种使用方式集成介绍,本文主要基于IDEA使用
- IDEA下载LOMBOK插件
如果IDEA里面搜索不到,可以去下面拆件网关搜索 plugins.jetbrains.com/plugin/6317...
- MVN项目添加POM依赖
java
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
使用介绍
常见注解
@NonNull
使用在入参上,相当于自动做了判空
java
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
相当于
java
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person is marked non-null but is null");
}
this.name = person.getName();
}
}
@Getter/@Setter
升了很多自动自动写get set方法
java
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
/**
* @author toby
* @date 2023/12/10 16:33
*/
public class GetterSetterExample {
/**
* Age of the person. Water is wet.
*
* @param age New value for this person's age. Sky is blue.
* @return The current value of this person's age. Circles are round.
*/
@Getter
@Setter
private int age = 10;
/**
* Name of the person.
* -- SETTER --
* Changes the name of this person.
*
* @param name The new value.
*/
@Setter(AccessLevel.PROTECTED)
private String name;
@Override
public String toString() {
return String.format("%s (age: %d)", name, age);
}
}
相当于JAVA
java
public class GetterSetterExample {
/**
* Age of the person. Water is wet.
*/
private int age = 10;
/**
* Name of the person.
*/
private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
/**
* Age of the person. Water is wet.
*
* @return The current value of this person's age. Circles are round.
*/
public int getAge() {
return age;
}
/**
* Age of the person. Water is wet.
*
* @param age New value for this person's age. Sky is blue.
*/
public void setAge(int age) {
this.age = age;
}
/**
* Changes the name of this person.
*
* @param name The new value.
*/
protected void setName(String name) {
this.name = name;
}
}
@ToString
自动生成tostring方法
@EqualsAndHashCode
生成hashCode
和equals
@Data
A shortcut for @ToString
, @EqualsAndHashCode
, @Getter
on all fields, and @Setter
on all non-final fields, and @RequiredArgsConstructor
其他注解
所有注解介绍也可以查看这个url:projectlombok.org/api/
原理说明
Lombok插件的原理是通过在编译期间对Java源代码进行注解处理器的处理,生成重复代码的部分,并将其插入到生成的字节码中。
当你在Java类中使用Lombok注解时,IDE会将这些注解标记为特殊的标记,并将它们传递给Lombok插件。在编译过程中,当编译器遇到这些标记时,它会将代码的控制权传递给Lombok的注解处理器。
Lombok的注解处理器会解析这些注解,并根据注解的定义生成相应的代码。例如,当你在一个字段上使用@Getter
注解时,Lombok会自动生成该字段的getter方法。类似地,当你使用@Setter
注解时,Lombok会生成setter方法。这些生成的代码将被插入到编译期间生成的字节码中。
在实际的实现中,Lombok使用了Java的注解处理API(javax.annotation.processing)来创建自定义的注解处理器。Lombok的注解处理器会扫描Java源代码中的注解,并使用AST(Abstract Syntax Tree,抽象语法树)来解析和修改源代码。它会根据注解的类型和参数生成相应的代码,并将其添加到AST中的适当位置。最后,修改后的AST将被转换回Java源代码,并由编译器编译成字节码。
需要注意的是,Lombok的代码生成是在编译期间进行的,而不是在运行时。生成的代码将成为最终的字节码的一部分,而不是在运行时使用反射或动态代理来生成代码。这样可以避免运行时性能开销,并使生成的代码在运行时具有与手动编写代码相同的行为。
具体例子,比如前文的GetterSetterExample
,最终生成的class反编译后如下: