¿Cómo funciona lombok?

148

Conocí a lombok hoy.
Estoy muy ansioso por saber cómo funciona.
Un artículo de Java Geek da algunas pistas, pero no me queda perfectamente claro:

Java 6 elimina apt y hace que javac pueda administrar anotaciones, agilizando el proceso para obtener una informática de un solo paso más simple. Este es el camino tomado por Lombok.

Tal vez con Java 6 el proceso de compilación será: javac -> apt -> lombok apt process -> leer archivos de clase y agregar métodos set / get usando ASM ?

¿Podría mostrarme más detalles sobre el mecanismo?

uuidcode
fuente
1
Consulte este artículo: stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

Respuestas:

135

Lombok efectivamente codifica contra API interna, como dijo Sean Patrick Floyd. Sin embargo, como lombok es SOLO involucrado en la fase de compilación, es engañoso afirmar que Lombok solo se ejecutará en una VM de sol. Solo se compilará en ecj o sun's javac. Sin embargo, la gran mayoría de las máquinas virtuales, si es que envían un compilador, son una de esas dos. Por ejemplo, la VM de Apple se envía con stock javac de Sun, y como tal, lombok funciona bien en Mac. Lo mismo ocurre con la VM Soylatte, por ejemplo.

Mientras que para javac realmente tenemos que seguir con sus actualizaciones, en parte debido a una gran cantidad de trabajo en curso en su compilador en este momento, hemos tenido que hacer solo 1 ajuste menor a nuestro soporte de eclipse en muchas versiones de eclipse. Entonces, si bien hacemos código contra API interna, son bits relativamente estables.

Si lo que hace lombok se pudiera hacer sin recurrir a la API interna, habríamos hecho otra cosa, pero no se puede hacer, por lo que recurrimos al uso interno de la API.

NB: Soy uno de los desarrolladores principales de lombok, así que probablemente soy un poco parcial: P

rzwitserloot
fuente
77
Genial saber de la fuente (+1). Admito que mi declaración sobre correr fue engañosa. Quise decir que Lombok solo puede ejecutarse en máquinas virtuales de Sun, pero el código resultante es, por supuesto, neutral en la plataforma.
Sean Patrick Floyd
Me pregunto si el procesador de anotaciones puede delegar todo al compilador de eclipse, incluso si se ejecuta a través de JavaC de esa manera, solo hay un procesador al que llamar.
Arquímedes Trajano
@rzwitserloot: por eso me gusta mucho SO. Respuestas genuinas del mismo desarrollador central.
gaurav
78

Utiliza la API de procesamiento de anotaciones conectables JSR 269 disponible en Java 6.

Tenga en cuenta que lombok.jar contiene un archivo llamado /META-INF/services/javax.annotation.processing.Processor. Cuando javacve este archivo en una ruta de clase de compilación, ejecuta procesadores de anotaciones definidos allí durante la compilación.

axtavt
fuente
gran respuesta @axtavt!
gaurav
54

Además de la respuesta de axtavt: Lombok usa mucho más de lo que expone la API JSR 269. Lombok codifica contra a) apis internos de javac yb) apis internos de eclipse (en un procesador separado). JSR 269 no le permite modificar el código fuente existente, pero cuando emite unElement nodo AST subyacente, puede modificar el AST (que es lo que hace el proyecto Lombok).

Por lo tanto, Lombok es un gran truco que solo se ejecutará compilar en un Sun VM (afaik). Es una gran pieza de software, pero también es odiada por muchos por ser un hack no tan estándar.

Sean Patrick Floyd
fuente
1
¿Sigue siendo información válida?
Ondra Žižka
1
Sip. Es verdad, todo eso.
Sean Patrick Floyd el
@SeanPatrickFloyd Addendum: Todavía no he tenido problemas para compilar anotaciones de Lombok con OpenJDK 11.
orithena
1
@orithena sí, eso debería funcionar. a menos que introduzca un segundo procesador de anotaciones y de repente se encuentre con condiciones de carrera porque Lombok está cambiando el AST que el otro procesador espera encontrar.
Sean Patrick Floyd el
2
Intentaré responder a mi propia pregunta, valide cuando tenga la oportunidad "Dado que Groovy / Kotlin viene con su propio compilador completo, que se encargará de generar el código de bytes. No es necesario hackear el proceso de generación de código de bytes de otro compilador (Compilador Java)".
So-random-dude