Einführung, Verwendung, Funktionsprinzip, Vor- und Nachteile von Lombok

1. Einführung in Lombok

Allgemeine Bedeutung: Lombok ist eine Java-Bibliothek, die automatisch in Editoren und Build-Tools integriert werden kann, um die Java-Entwicklung zu vereinfachen. Durch das Hinzufügen von Anmerkungen ist es nicht erforderlich, Getter- oder Eques-Methoden für die Klasse zu schreiben, und Protokollvariablen können automatisiert werden. Offizieller Website-Link

Kurz gesagt: Lombok kann Java-Code in Form einfacher Annotationen vereinfachen und die Entwicklungseffizienz von Entwicklern verbessern.

2.Lombok-Nutzung

Die für die Verwendung von Lombok erforderliche Entwicklungsumgebung ist Java+Maven+IntelliJ IDEA oder Eclipse (Lombok-Plugin installieren)

2.1 Maven-Abhängigkeiten hinzufügen

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
    <scope>provided</scope>
</dependency>

2.2 Plug-Ins installieren Die
Verwendung von Lombok erfordert auch die Zusammenarbeit von Plug-Ins. Ich verwende die Idee des Entwicklungstools. Hier erkläre ich nur, wie Sie das Lombok-Plug-In-Idee installieren, Eclipse- und Myeclipse-Partner verwenden und es selbst bei Google installieren .
Öffnen Sie die Einstellungen der Idee, klicken Sie auf Plugins, klicken Sie auf Repositorys durchsuchen, suchen Sie im Popup-Fenster nach Lombok und installieren Sie es dann.
Bild

2.3 Lösen Sie Fehlerprobleme bei der Kompilierung

Beim Kompilieren ist ein Fehler aufgetreten, möglicherweise weil der Anmerkungsprozessor nicht aktiviert war. Annotation Processors > Enable annotation processing. Nachdem die Einrichtung abgeschlossen ist, läuft das Programm normal.

Bild

2.4 Beispiel

Hier sind zwei Kastanien, um den Unterschied zwischen der Verwendung von Lombok und der Nichtverwendung zu sehen.

Erstellen Sie eine Benutzerklasse

Ich verwende Lombok nicht

public class User implements Serializable {
    
    

    private static final long serialVersionUID = -8054600833969507380L;

    private Integer id;

    private String username;

    private Integer age;

    public User() {
    
    
    }

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public Integer getAge() {
    
    
        return age;
    }

    public void setAge(Integer age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) {
    
    
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
    
    
            return false;
        }
        User user = (User) o;
        return Objects.equals(id, user.id) &&
                Objects.equals(username, user.username) &&
                Objects.equals(age, user.age);
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(id, username, age);
    }

}

Benutze Lombok

@Data
public class User implements Serializable {
    
    

    private static final long serialVersionUID = -8054600833969507380L;

    private Integer id;

    private String username;

    private Integer age;

}

Kompilieren Sie die Quelldatei und dekompilieren Sie dann die Klassendatei. Das Dekompilierungsergebnis ist wie unten dargestellt. Hinweis: Durch die @Data-Annotation einer Klasse werden automatisch die Methoden Setter/Getter, equal, canEqual, hashCode und toString für alle Eigenschaften der Klasse generiert. Wenn es sich um eine endgültige Eigenschaft handelt, wird für die Eigenschaft keine Setter-Methode generiert.

Bild

Automatisierungsprotokollvariablen

@Slf4j
@RestController
@RequestMapping(("/user"))
public class UserController {
    
    

    @GetMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id) {
    
    
        User user = new User();
        user.setUsername("风清扬");
        user.setAge(21);
        user.setId(id);

        if (log.isInfoEnabled()) {
    
    
            log.info("用户 {}", user);
        }

        return user;
    }

}

Durch die Dekompilierung können Sie sehen, dass die Annotation @Slf4j eine Protokollvariable (streng genommen eine Konstante) generiert. Sie können Protokoll verwenden, um Protokolle in einer Klasse aufzuzeichnen, ohne ein Protokoll zu deklarieren.

Bild

2.5 Häufig verwendete Anmerkungen
Hier sind einige häufig verwendete Anmerkungen:

@Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter 使用方法同上,区别在于生成的是getter方法。
@ToString 注解在类,添加toString方法。
@EqualsAndHashCode 注解在类,生成hashCode和equals方法。
@NoArgsConstructor 注解在类,生成无参的构造方法。
@RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
@Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Slf4j 注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);

3. Lombok-Funktionsprinzip

Bei der Verwendung von Lombok müssen Sie lediglich die entsprechenden Anmerkungen hinzufügen und müssen dafür keinen Code schreiben. Wie wird der automatisch generierte Code generiert?

Der Kernpunkt ist die Analyse von Annotationen. Während JDK5 Anmerkungen einführte, stellte es auch zwei Parsing-Methoden bereit.

Laufzeitanalyse
Für Anmerkungen, die zur Laufzeit analysiert werden können, muss @Retention auf RUNTIME gesetzt werden, damit die Anmerkung durch Reflektion abgerufen werden kann. Das Reflexionspaket java.lang.reflect stellt eine Schnittstelle AnnotatedElement bereit, die mehrere Methoden zum Abrufen von Anmerkungsinformationen definiert. Klasse, Konstruktor, Feld, Methode, Paket usw. implementieren alle diese Schnittstelle. Freunde, die mit Reflexion vertraut sind, sollten damit sehr vertraut sein it. Machen Sie sich mit dieser Parsing-Methode vertraut.

Parsing zur Kompilierungszeit
Es gibt zwei Mechanismen für das Parsing zur Kompilierungszeit, die im Folgenden kurz beschrieben werden:

1)Anmerkungsverarbeitungstool

apt wurde aus JDK5 generiert. JDK7 wurde als abgelaufen markiert und wird nicht zur Verwendung empfohlen. Es wurde in JDK8 vollständig gelöscht. Ab JDK6 können Sie es durch die Pluggable Annotation Processing API ersetzen. Es gibt zwei Hauptgründe für apt ersetzt werden:

(1) Die APIs befinden sich alle im nicht standardmäßigen Paket com.sun.mirror.
  (2) Sie sind nicht in Javac integriert und erfordern zusätzliche Vorgänge.

2)Pluggable Annotation Processing API

JSR 269 wurde seit JDK6 hinzugefügt. Als Alternative zu apt löst es zwei Probleme von apt. Wenn javac ausgeführt wird, ruft es das Programm auf, das die API implementiert, sodass wir einige Verbesserungen am Compiler vornehmen können. Der Prozess von javac Ausführung wie folgt:

Bild

Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:

1.javac对源代码进行分析,生成了一棵抽象语法树(AST2.运行过程中调用实现了“JSR 269 API”的Lombok程序
3.此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
4.javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)

Beim Lesen des Lombok-Quellcodes habe ich festgestellt, dass die Implementierung der entsprechenden Annotationen in HandleXXX erfolgt. Beispielsweise befindet sich die Implementierung der @Getter-Annotation in HandleGetter.handle(). Es gibt einige andere Bibliotheken, die auf diese Weise implementiert sind, z. B. Google Auto , Dagger usw.

4. Vor- und Nachteile von Lombok

Vorteil:

(1) Es kann automatisch Konstruktoren, Getter/Setter, Equals, Hashcode, toString und andere Methoden in Form von Anmerkungen generieren, was eine gewisse Entwicklungseffizienz verbessert. (2) Es macht den Code prägnant und erfordert nicht zu viel Geld Achten Sie auf die
entsprechenden Methoden
(3). Wenn Attribute geändert werden, vereinfacht dies auch die Wartung der für diese Attribute generierten Getter/Setter-Methoden.

Mangel:

(1) Das Überladen mehrerer Parameterkonstruktoren wird nicht unterstützt.
(2) Obwohl es die Mühe des manuellen Erstellens von Getter-/Setter-Methoden erspart, verringert es die Lesbarkeit und Integrität des Quellcodes erheblich und verringert den Komfort beim Lesen des Quellcodes

Supongo que te gusta

Origin blog.csdn.net/qq_43842093/article/details/133250441
Recomendado
Clasificación