Wie funktioniert Lombok?

148

Ich habe heute Lombok getroffen .
Ich bin sehr gespannt, wie es funktioniert.
Ein Java Geek-Artikel gibt einige Hinweise, aber mir ist nicht ganz klar:

Java 6 entfernt apt und macht javac in der Lage, Anmerkungen zu verwalten, wodurch der Prozess optimiert wird, um ein einfacheres Einzelschritt-Computing zu erhalten. Dies ist der Weg, den Lombok eingeschlagen hat.

Vielleicht lautet der Kompilierungsprozess mit Java 6: javac -> apt -> lombok apt-Prozess -> Klassendateien lesen und Set / Get-Methoden mit ASM hinzufügen ?

Können Sie mir mehr Details zum Mechanismus zeigen?

uuidcode
quelle
1
Überprüfen Sie diesen Artikel: stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

Antworten:

135

Lombok codiert tatsächlich gegen die interne API, wie Sean Patrick Floyd sagte. Da Lombok jedoch NUR an der Kompilierungsphase beteiligt ist, wird die irreführende Behauptung, Lombok sei nur auf einer Sun-VM ausgeführt. Es wird nur auf ecj oder sun's javac kompiliert. Die überwiegende Mehrheit der VMs da draußen, wenn sie überhaupt einen Compiler ausliefern, ist eine dieser beiden. Zum Beispiel wird die Apple VM mit serienmäßigem Sun Javac ausgeliefert, und als solches funktioniert Lombok auf Macs einwandfrei. Gleiches gilt zum Beispiel für die Soylatte VM.

Während wir für javac wirklich bei ihren Updates bleiben müssen, teilweise aufgrund der vielen laufenden Arbeiten an ihrem Compiler, mussten wir unsere Eclipse-Unterstützung über viele verschiedene Versionen von Eclipse nur geringfügig anpassen. Während wir also gegen die interne API codieren, sind sie relativ stabile Bits.

Wenn das, was lombok tut, ohne auf die interne API zurückgreifen könnte, hätten wir etwas anderes getan, aber es kann nicht getan werden, also greifen wir auf die interne API-Verwendung zurück.

NB: Ich bin einer der Hauptentwickler von Lombok, also bin ich wahrscheinlich ein wenig voreingenommen: P.

rzwitserloot
quelle
7
Schön, von der Quelle zu hören (+1). Ich gebe zu, meine Aussage über das Laufen war irreführend. Ich meinte, Lombok kann nur auf Sun VMs ausgeführt werden, aber der resultierende Code ist natürlich plattformneutral.
Sean Patrick Floyd
Ich frage mich, ob der Annotationsprozessor alles an den Eclipse-Compiler delegieren kann, selbst wenn er über JavaC ausgeführt wird, sodass nur ein Prozessor aufgerufen werden kann.
Archimedes Trajano
@rzwitserloot: deshalb mag ich SO wirklich. Echte Antworten vom Kernentwickler selbst.
Gaurav
78

Es verwendet die in Java 6 verfügbare JSR 269 Pluggable Annotation Processing API .

Beachten Sie, dass lombok.jareine Datei mit dem Namen enthält /META-INF/services/javax.annotation.processing.Processor. Wenn javacdiese Datei in einem Kompilierungsklassenpfad angezeigt wird, werden dort während der Kompilierung definierte Anmerkungsprozessoren ausgeführt.

axtavt
quelle
tolle Antwort @axtavt!
Gaurav
54

Als Ergänzung zu Axtavts Antwort: Lombok verwendet viel mehr als die JSR 269-API. Lombok-Codes gegen a) interne Javac-Apis und b) interne Eclipse-Apis (in einem separaten Prozessor). Mit JSR 269 können Sie vorhandenen Quellcode nicht ändern. Wenn Sie jedoch einen Elementin den zugrunde liegenden AST-Knoten umwandeln, können Sie den AST tatsächlich ändern (wie es das Projekt Lombok tut).

So Lombok ist ein großer Hack, nur wird laufen Kompilierung auf einer Sun VM (afaik). Es ist eine großartige Software, aber es wird auch von vielen gehasst, weil sie so ein nicht standardmäßiger Hack ist.

Sean Patrick Floyd
quelle
1
Ist das noch gültige Info?
Ondra Žižka
1
Jep. Es ist alles wahr.
Sean Patrick Floyd
@ SeanPatrickFloyd Nachtrag: Ich hatte noch keine Probleme beim Kompilieren von Lombok-Anmerkungen mit OpenJDK 11.
Orithena
1
@orithena ja, das sollte funktionieren. es sei denn, Sie führen einen zweiten Annotationsprozessor ein und geraten plötzlich unter Rennbedingungen, weil Lombok den AST ändert, den der andere Prozessor erwartet zu finden.
Sean Patrick Floyd
2
Ich werde versuchen, meine eigene Frage zu beantworten. Bitte überprüfen Sie, wann Sie die Möglichkeit haben. "Da Groovy / Kotlin über einen eigenen vollständigen Compiler verfügt, wird der Bytecode generiert. Es ist nicht erforderlich, den Bytecode-Generierungsprozess eines anderen Compilers (Java Compiler) zu hacken."
so zufälliger Typ