161 votes

Comment fonctionne lombok ?

J'ai rencontré lombok aujourd'hui.
Je suis très impatient 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, ce qui simplifie le processus pour obtenir un calcul en une seule étape. C'est la chemin emprunté par Lombok.

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

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

1 votes

148voto

rzwitserloot Points 434

Lombok code effectivement 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 qu'avec ecj ou javac de Sun. Cependant, la grande majorité des VMs, si elles fournissent un compilateur, sont l'une de ces deux solutions. Par exemple, la VM d'Apple est livrée avec le javac de sun, et en tant que tel, lombok fonctionne très bien sur les macs. Il en va de même pour la VM Soylatte, par exemple.

Alors que pour javac nous devons vraiment nous en tenir à leurs mises à jour, en partie à cause du travail en cours sur leur compilateur, nous n'avons eu à faire qu'un seul ajustement mineur à notre support eclipse sur de nombreuses versions d'eclipse. Ainsi, bien que nous codions contre l'API interne, il s'agit de bits relativement stables.

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

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

9 votes

C'est génial d'entendre 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 les machines virtuelles Sun, mais le code qui en résulte est bien sûr indépendant de la plate-forme.

0 votes

Je me demande en quelque sorte si le processeur d'annotation peut tout déléguer au compilateur d'Eclipse même s'il est exécuté via JavaC ; de cette façon, il n'y a qu'un seul processeur à appeler.

0 votes

@rzwitserloot : c'est pourquoi j'aime vraiment SO. Des réponses authentiques de la part du core dev lui-même.

93voto

axtavt Points 126632

Il utilise JSR 269 API Pluggable de traitement des annotations disponible dans Java 6.

Notez que lombok.jar contient un fichier nommé /META-INF/services/javax.annotation.processing.Processor . Quand javac voit ce fichier dans un classpath de compilation, il exécute les processeurs d'annotation qui y sont définis pendant la compilation.

59voto

Sean Patrick Floyd Points 109428

En addendum à la réponse d'axtavt : Lombok utilise beaucoup plus que ce que l'api JSR 269 expose. Lombok code contre a) des apis javac internes et b) des apis eclipse internes (dans un processeur séparé). La JSR 269 ne vous permet pas de modifier le code source existant, mais lorsque vous intégrez un fichier Element au nœud AST sous-jacent, vous pouvez réellement modifier l'AST (c'est ce que fait le projet Lombok).

Lombok est donc un énorme hack qui ne compilera qu'en utilisant javac ou le compilateur d'eclipse. C'est un excellent logiciel, mais il est également détesté par beaucoup pour être un tel hack non standard.

0 votes

@SeanPatrickFloyd Addendum : Je n'ai pas encore eu de problèmes pour compiler les annotations Lombok avec OpenJDK 11.

1 votes

@orithena oui, cela devrait fonctionner, à moins que vous n'introduisiez un second processeur d'annotations et que vous ne vous retrouviez soudainement dans des situations de concurrence parce que Lombok modifie l'AST que l'autre processeur s'attend à trouver.

52voto

songsungkyun Points 491

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X