Comment fonctionne Lombok?

148

J'ai rencontré Lombok aujourd'hui.
J'ai très hâte de savoir comment cela fonctionne.
Un article de Java Geek donne quelques indices mais ce n'est pas parfaitement clair pour moi:

Java 6 supprime apt et rend javac capable de gérer les annotations, rationalisant le processus pour obtenir un calcul en une seule étape plus simple. C'est le chemin emprunté par Lombok.

Peut-être qu'avec Java 6, le processus de compilation sera: javac -> apt -> lombok apt process -> lire les fichiers de classe et ajouter des méthodes set / get en utilisant ASM ?

Pouvez-vous me montrer plus de détails sur le mécanisme?

uuidcode
la source
1
Consultez cet article: stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

Réponses:

135

Lombok code en effet contre l'API interne, comme l'a dit Sean Patrick Floyd. Cependant, comme lombok est UNIQUEMENT impliqué dans la phase de compilation, il est trompeur de prétendre que Lombok ne fonctionnera que sur une VM Sun. Il ne compilera que sur ecj ou javac de sun. Cependant, la grande majorité des machines virtuelles, si elles contiennent un compilateur, sont l'une de ces deux. Par exemple, la machine virtuelle Apple est livrée avec sun javac, et en tant que tel, lombok fonctionne très bien sur les macs. Il en va de même pour la machine virtuelle soylatte, par exemple.

Alors que pour javac, nous devons vraiment nous en tenir à leurs mises à jour, en partie à cause de beaucoup de travail en cours sur leur compilateur en ce moment, nous n'avons dû faire qu'un seul ajustement mineur à notre prise en charge d'éclipse sur de nombreuses versions d'eclipse. Ainsi, alors que nous codons contre l'API interne, ce sont des bits relativement stables.

Si ce que fait lombok pouvait être fait sans recourir à l'API interne, nous aurions fait autre chose, mais cela ne peut pas être fait, nous avons donc recours à l'utilisation de l'API interne.

NB: je suis l'un des principaux développeurs de lombok, donc, je suis probablement un peu biaisé: P

rzwitserloot
la source
7
Super à entendre de la source (+1). J'admets que ma déclaration sur la course à pied était trompeuse. Je voulais dire que Lombok ne peut fonctionner que sur des machines virtuelles Sun, mais le code qui en résulte est bien sûr neutre de la plate-forme.
Sean Patrick Floyd
Je me demande en quelque sorte si le processeur d'annotation peut tout déléguer au compilateur eclipse même s'il est exécuté via JavaC de cette façon, il n'y a qu'un seul processeur à appeler.
Archimedes Trajano
@rzwitserloot: c'est pourquoi j'aime vraiment SO. Des réponses authentiques du développeur principal lui-même.
gaurav
78

Il utilise l' API JSR 269 Pluggable Annotation Processing disponible dans Java 6.

Notez que lombok.jarcontient un fichier nommé /META-INF/services/javax.annotation.processing.Processor. Lorsqu'il javacvoit ce fichier dans un chemin de classe de compilation, il exécute les processeurs d'annotation qui y sont définis lors de la compilation.

axtavt
la source
bonne réponse @axtavt!
gaurav
54

En complément à la réponse d'axtavt: Lombok utilise beaucoup plus que ce que l'API JSR 269 expose. Lombok code contre a) les API javac internes et b) les API Eclipse internes (dans un processeur séparé). JSR 269 ne vous permet pas de modifier le code source existant, mais lorsque vous transtypez un Elementvers le nœud AST sous-jacent, vous pouvez en fait modifier l'AST (ce que fait le projet Lombok).

Donc Lombok est un énorme hack qui ne fonctionnera que sur une machine virtuelle Sun (afaik). C'est un excellent logiciel, mais il est également détesté par beaucoup pour être un hack non standard.

Sean Patrick Floyd
la source
1
Cette information est-elle toujours valide?
Ondra Žižka
1
Ouaip. C'est vrai, tout ça.
Sean Patrick Floyd
Addendum @SeanPatrickFloyd: Je n'ai encore eu aucun problème à compiler les annotations Lombok avec OpenJDK 11.
orithena
1
@orithena oui, ça devrait marcher. à moins que vous n'introduisiez un deuxième processeur d'annotation et que vous vous heurtiez soudainement à des conditions de concurrence car Lombok change l'AST que l'autre processeur s'attend à trouver.
Sean Patrick Floyd
2
Je vais essayer de répondre à ma propre question, veuillez valider quand vous en aurez l'occasion "Puisque Groovy / Kotlin est livré avec son propre compilateur complet, cela se chargera de générer le bytecode. Pas besoin de pirater le processus de génération de bytecode d'un autre compilateur (Java Compiler)."
so-random-mec le