web-dev-qa-db-fra.com

Comment fonctionne lombok?

J'ai rencontré lombok aujourd'hui.
J'ai très hâte de savoir comment cela fonctionne.
A Java Geek Article 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 ?

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

128
uuidcode

Lombok code en effet contre l'API interne, comme l'a dit Sean Patrick Floyd. Cependant, comme lombok est SEULEMENT impliqué dans la phase de compilation, il est trompeur de prétendre que Lombok ne fonctionnera que sur une machine virtuelle Sun. Il compilera uniquement sur ecj ou javac de Sun. Cependant, la grande majorité des machines virtuelles, si elles livrent un compilateur, sont l'une de ces deux. Par exemple, le Apple VM est livré avec le stock Sun javac, et en tant que tel, le 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 en raison de beaucoup de travail en cours sur leur compilateur en ce moment, nous n'avons dû apporter qu'un ajustement mineur à notre prise en charge Eclipse sur de nombreuses versions d'Eclipse. Ainsi, bien que nous codions par rapport à 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

119
rzwitserloot

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

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

64
axtavt

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 apis javac internes et b) les apis Eclipse internes (dans un processeur séparé). JSR 269 ne vous permet pas de modifier le code source existant, mais lorsque vous transtypez un Element vers le nœud sous-jacent AST, vous pouvez réellement modifier le = AST (c'est ce que fait le projet Lombok).

Donc Lombok est un énorme hack qui ne fera que courir compiler sur un Sun VM (afaik). C'est un excellent logiciel, mais il est également détesté par beaucoup pour être un tel hack non standard.

45
43
uuidcode