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依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
运用介绍
常见注解
@NonNull
运用在入参上,相当于主动做了判空
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
相当于
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办法
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
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反编译后如下: