Come funziona lombok?


148

Ho incontrato lombok oggi.
Sono molto ansioso di sapere come funziona.
Un articolo Java Geek fornisce alcuni indizi ma non è perfettamente chiaro per me:

Java 6 rimuove apt e rende javac in grado di gestire le annotazioni, ottimizzando il processo per ottenere un calcolo a singolo passaggio più semplice. Questo è il percorso intrapreso da Lombok.

Forse con Java 6 il processo di compilazione sarà: javac -> apt -> processo lombok apt -> leggi i file di classe e aggiungi metodi set / get usando ASM ?

Potresti mostrarmi maggiori dettagli sul meccanismo?


Risposte:


135

Lombok infatti codifica contro l'API interna, come ha affermato Sean Patrick Floyd. Tuttavia, poiché lombok è coinvolto SOLO nella fase di compilazione, è fuorviante affermare che Lombok funzionerà solo su una VM solare. Si compilerà solo su ecj o javac di sun. Tuttavia, la stragrande maggioranza delle macchine virtuali là fuori, se spediscono un compilatore, sono una di quelle due. Ad esempio, la VM di Apple viene fornita con stock sun javac e, come tale, lombok funziona perfettamente sui Mac. Lo stesso vale per la VM soylatte, ad esempio.

Mentre per javac dobbiamo davvero attenerci ai loro aggiornamenti, in parte a causa del lavoro in corso sul loro compilatore in questo momento, abbiamo dovuto apportare solo una piccola modifica al nostro supporto eclipse su molte molte versioni di eclipse. Quindi, mentre facciamo il codice contro l'API interna, sono bit relativamente stabili.

Se ciò che fa lombok potesse essere fatto senza ricorrere all'API interna, avremmo fatto qualcos'altro, ma non è possibile, quindi ricorrere all'uso interno dell'API.

NB: Sono uno dei principali sviluppatori di lombok, quindi probabilmente sono un po 'di parte: P


7
Ottimo per ascoltare dalla fonte (+1). Lo ammetto, la mia affermazione sulla corsa era fuorviante. Volevo dire che Lombok può essere eseguito solo su macchine virtuali Sun, ma il codice risultante è ovviamente neutro per la piattaforma.
Sean Patrick Floyd,

Mi chiedo se il processore di annotazione può delegare tutto al compilatore di eclissi anche se viene eseguito tramite JavaC in questo modo c'è un solo processore da chiamare.
Archimede Trajano,

@rzwitserloot: ecco perché mi piace molto SO. Risposte genuine dallo stesso sviluppatore principale.
gaurav,

78

Utilizza l' API di elaborazione annotazione collegabile JSR 269 disponibile in Java 6.

Si noti che lombok.jarcontiene un file denominato /META-INF/services/javax.annotation.processing.Processor. Quando javacvede questo file in un percorso di classe della compilation, esegue processori di annotazione lì definiti durante la compilazione.


ottima risposta @axtavt!
gaurav,

54

In aggiunta alla risposta di axtavt: Lombok usa molto di più di quanto espone l'APS JSR 269. Codici di Lombok contro a) API javac interne eb) API eclissi interne (in un processore separato). JSR 269 non consente di modificare il codice sorgente esistente, ma quando si esegue il cast di un Elementnodo AST sottostante, è possibile modificare effettivamente l'AST (che è ciò che fa il progetto Lombok).

Così Lombok è un enorme hack che servirà solo eseguito compilazione su una macchina virtuale di Sun (afaik). È un ottimo software, ma è anche odiato da molti per essere un tale hack non standard.


1
Sono ancora informazioni valide?
Ondra Žižka,

1
Sì. È vero, tutto.
Sean Patrick Floyd,

Addendum @SeanPatrickFloyd: non ho ancora avuto problemi a compilare le annotazioni Lombok con OpenJDK 11.
orithena

1
@orithena sì, dovrebbe funzionare. a meno che non introduciate un secondo processore di annotazione e vi imbattiate improvvisamente in condizioni di competizione perché Lombok sta cambiando l'AST che l'altro processore si aspetta di trovare.
Sean Patrick Floyd,

2
Proverò a rispondere alla mia domanda, per favore convalida quando ne avrai la possibilità "Dato che Groovy / Kotlin viene fornito con un proprio compilatore completo, che si occuperà della generazione del bytecode. Non è necessario hackerare il processo di generazione del bytecode di un altro compilatore (Java Compiler)."
tizio casuale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.