Использование Lombok очень простое, давайте рассмотрим его вместе:
1) Введите соответствующий пакет maven:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
Scope=provided в Lombok означает, что он вступает в силу только на этапе компиляции и его не нужно вводить в пакет. Это тот факт, что Lombok правильно компилирует файлы Java с аннотациями Lombok в полные файлы классов во время компиляции.
2) Добавить поддержку инструментов IDE для Lombok:
Поддержка Lombok, представленная в IDEA, выглядит следующим образом:
- Нажмите на интерфейс File--Settings, чтобы установить плагин Lombok:
-
Нажмите на интерфейс настроек File--Settings, чтобы включить обработчики аннотаций:
Эта опция включена, чтобы аннотации Lombok работали во время компиляции.
Установка подключаемого модуля Lombok для Eclipse может быть выполнена с помощью Baidu, и это относительно просто.Стоит упомянуть, что встроенный компилятор Eclipse — это не Oracle javac, а Eclipse Compiler for Java (ECJ), реализованный самой Eclipse. чтобы ECJ поддерживал Lombok, вам нужно добавить следующие два элемента в файл конфигурации eclipse.ini:
-Xbootclasspath/a:[путь, где находится lombok.jar]
-javaagent:[путь, где находится lombok.jar]
3) Принцип реализации ломбока:
- javac анализирует исходный код и создает абстрактное синтаксическое дерево (AST)
- Программа Lombok, реализующая JSR 269, вызывается в процессе компиляции javac.
- В этот момент Lombok обрабатывает AST, полученный на первом шаге, находит синтаксическое дерево (AST), соответствующее классу, в котором находится аннотация Lombok, а затем модифицирует синтаксическое дерево (AST), чтобы добавить соответствующий узел дерева, определенный Аннотация Ломбока.
- javac использует модифицированное абстрактное синтаксическое дерево (AST) для создания файлов байт-кода.
4) Использование аннотаций Ломбока:
Общие аннотации для классов POJO:
@Getter/@Setter: Воздействуя на класс, генерируйте методы получения/установки для всех переменных-членов; воздействуя на переменные-члены, генерируйте методы получения/установки для переменной-члена. Вы можете установить права доступа и отложенную загрузку и так далее.
package com.trace;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
/**
* Created by Trace on 2018/5/19.<br/>
* DESC: 测试类
*/
@SuppressWarnings("unused")
public class TestClass {
public static void main(String[] args) {
}
@Getter(value = AccessLevel.PUBLIC)
@Setter(value = AccessLevel.PUBLIC)
public static class Person {
private String name;
private int age;
private boolean friendly;
}
public static class Animal {
private String name;
private int age;
@Getter @Setter private boolean funny;
}
}
В представлении «Структура» вы можете увидеть, что были сгенерированы такие методы, как геттеры/сеттеры:
Скомпилированный код выглядит следующим образом: [Это также шаблонный код, который необходимо писать для традиционного программирования на Java]
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.trace;
public class TestClass {
public TestClass() {
}
public static void main(String[] args) {
}
public static class Animal {
private String name;
private int age;
private boolean funny;
public Animal() {
}
public boolean isFunny() {
return this.funny;
}
public void setFunny(boolean funny) {
this.funny = funny;
}
}
public static class Person {
private String name;
private int age;
private boolean friendly;
public Person() {
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public boolean isFriendly() {
return this.friendly;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setFriendly(boolean friendly) {
this.friendly = friendly;
}
}
}
@Нанизывать:Воздействуя на класс, переопределяя метод toString() по умолчанию, вы можете ограничить отображение определенных полей через атрибут of и исключить определенные поля через атрибут exclude.
@EqualsAndHashCode:Действует на классы, переопределяя значения по умолчанию equals и hashCode.
@NonNull:В основном используемый в переменных-членах и параметрах, идентификатор не может быть пустым, иначе будет выдано исключение нулевого указателя.
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:Действует на классы для создания конструкторов. Существуют такие атрибуты, как staticName и доступ.
После установки атрибута staticName экземпляр будет создан статическим методом, а атрибут доступа может ограничивать права доступа.
@NoArgsConstructor: создает конструктор без аргументов;
@RequiredArgsConstructor: конструктор, который создает переменные-члены, содержащие аннотации final и @NonNull;
@AllArgsConstructor: создает конструктор со всеми аргументами.
Результат после компиляции:
public static class Person {
@NonNull
private String name;
private int age;
private boolean friendly;
public String toString() {
return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")";
}
@NonNull
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public boolean isFriendly() {
return this.friendly;
}
public void setName(@NonNull String name) {
if(name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
}
}
public void setAge(int age) {
this.age = age;
}
public void setFriendly(boolean friendly) {
this.friendly = friendly;
}
private Person() {
}
private static TestClass.Person of() {
return new TestClass.Person();
}
@ConstructorProperties({"name"})
Person(@NonNull String name) {
if(name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
}
}
@ConstructorProperties({"name", "age", "friendly"})
public Person(@NonNull String name, int age, boolean friendly) {
if(name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
this.age = age;
this.friendly = friendly;
}
}
}
@Данные:Воздействуя на класс, он представляет собой набор следующих аннотаций: @ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@Строитель:Воздействуйте на класс, превращая класс в шаблон строителя
@Бревно:Воздействует на класс для создания переменных журнала. Существуют разные аннотации для разных продуктов реализации журнала:
@Очистка:Автоматически закрывать ресурсы, действительные для объектов, реализующих интерфейс java.io.Closeable, таких как: типичные объекты потока ввода-вывода
Результат после компиляции следующий:
Это слишком лаконично.
@SneakyThrows:Проверяемое исключение может быть перехвачено и выброшено, а приведенный выше основной метод можно переписать следующим образом:
@Синхронизировано:Действуя на уровне метода, он может заменить ключевое слово synchronize или lock, что не очень полезно.
Полный текст закончился!
Следующий:Intellij IDEA инструментов повышения эффективности Java