Das Prinzip von Lombok und der Grube der gleichzeitigen Nutzung von @Data und @Builder - Zusammenfassung der Erfahrungen mit dem Betreten der Grube - Unfallzusammenfassung 15 (wird einmal wöchentlich aktualisiert)

Schaffen Sie weiter, beschleunigen Sie das Wachstum! Dies ist der erste Tag meiner Teilnahme an der „Nuggets Daily New Plan · June Update Challenge“, klicken Sie hier, um die Details der Veranstaltung anzuzeigen

Problemhintergrund

Lombok verwendet sowohl @Data als auch @Builder, um einen parameterlosen Konstruktor zu erstellen und einen Fehler zu melden! Kompilierung schlägt fehl. Wie nachfolgend dargestellt:

Bild.png

Lombok @Data und @Builder analysieren die Nutzung separat

Lombok verwendet @Data, um parameterlose Konstruktoren und Getter/Setter-Methoden für alle Eigenschaften der Klasse zu generieren. Kann die Entwicklung unseres Codes vereinfachen. (Sie müssen das Lombok-Plugin installieren und Lombok-Abhängigkeiten importieren).

Beispielsweise können in der folgenden Entitätsklasse nach der Einführung von Lombok GET/SET-Methoden und parameterlose Konstruktoren automatisch generiert werden.

Bild.png Die kompilierte Klasse ist: Sie können sehen, dass nicht nur get und set für uns generiert werden, sondern auch der Standardkonstruktor ohne Argumente

Bild.png

Wie generiert man also automatisch einen parametrisierten Konstruktor? Die Verwendung der Annotation @Builder hilft uns, einen Konstruktor mit vollständiger Eigenschaft zu generieren.

Bild.png

Die kompilierte Klasse ist: Sie können sehen, dass der Konstruktor aller Attribute für uns gebaut wurde, aber wenn der Wert nur auf die Annotation @Builder verweist, können get und set nicht generiert werden.

Bild.png

Aber wenn Sie @Data und @Builder gleichzeitig verwenden, ist zu sehen, dass, obwohl die GET/SET-Methode generiert wird, die parameterlose Konstruktionsmethode verschwunden ist, was offensichtlich nicht akzeptabel ist, da viele Frameworks die parameterlose Konstruktion aufrufen, um zu erstellen Objekte.

Bild.png

Kompilierte Klasse:Bild.png

Wir versuchen, der Tet1-Klasse manuell einen parameterlosen Konstruktor hinzuzufügen. Kompilieren Sie und stellen Sie fest, dass der Fehler nicht bestanden wird:

Bild.png

Lösung

Wenn Lombok gleichzeitig @Data und @Builder verwendet und Sie eine parameterlose Struktur generieren möchten, müssen Sie die Annotation @Tolerate manuell in den Code einfügen, damit Lombok den angegebenen Konstruktor beim Generieren einer Klasse nicht kennt.

Bild.png

Lombok-Prinzip

Die Kompilierung von Java gliedert sich in folgende Phasen:

Symboltabelle parsen und füllen -> Annotationsverarbeitung -> Analyse und Bytecode-Generierung -> Binärklassendatei generieren.

  • Lombok verwendet JSR 269: Pluggable Annotation Processing API (Compile-Time Annotation Processor), implementiert von JDK 6, das den annotierten Code von Lombok zur Kompilierzeit für die Injektion in reguläre Java-Methoden konvertiert.

  • Während der Kompilierungsphase, wenn der Java-Quellcode in einen Syntaxbaum (AST) abstrahiert wird, modifiziert Lombok den AST dynamisch gemäß seinem eigenen Annotationsprozessor, fügt neuen Code (Knoten) hinzu und besteht nach all dem die Analyse erzeugt die endgültige Bytecode-Datei (.class), so funktioniert Lombok.

Ein einfacher Setter kann mit Hilfe von Annotationsprozessoren implementiert werden. Unsere Implementierungsschritte sind:

  • Anpassen einer Annotation-Tag-Schnittstelle und Implementieren eines angepassten Annotation-Prozessors;
  • Verwenden Sie die Javac-API von tools.jar, um AST (Abstract Syntax Tree) zu verarbeiten. 3. Kompilieren Sie den Code mit einem benutzerdefinierten Anmerkungsprozessor.

1. Definieren Sie benutzerdefinierte Anmerkungen und Anmerkungsprozessoren

Erstellen Sie zuerst eine MySetter.java, um eine Anmerkung anzupassen. Der Code lautet wie folgt:

Bild.png

Implementieren Sie dann einen benutzerdefinierten Anmerkungsprozessor. Der Code lautet wie folgt:

Bild.png Bild.png Bild.png

Die Testklasse ist wie folgt:

Bild.png

2. Kompilieren Sie den Anmerkungsprozessor und verwenden Sie dann den Anmerkungsprozessor, um die Klasse zu kompilieren

Zuerst müssen Sie den Anmerkungsprozessor kompilieren (javac -cp wird verwendet, um ein JAR-Paket eines Drittanbieters zur Kompilierung zu importieren).

Bild.png

Verwenden Sie dann den Anmerkungsprozessor, um die Testklasse Person zu kompilieren:

Wenn Sie sich zu diesem Zeitpunkt die generierte Person.class ansehen, können Sie feststellen, dass die Setter-Methode generiert wurde:

Bild.png

Bild.png

Zusammenfassen

Obwohl die Setter-Methode in der Testklasse generiert wurde, können wir die Setter-Methode natürlich nicht direkt während der Entwicklung aufrufen, da sie zur Kompilierzeit generiert wird. Daher stellt Lombok einen Plug-In-Mechanismus bereit, um unsere Entwicklung zu erleichtern. Wenn Sie können Rufen Sie direkt die Funktionen von Lombok auf.

おすすめ

転載: juejin.im/post/7103011031672176677