Como o lombok funciona?

148

Eu conheci lombok hoje.
Estou muito ansioso para saber como isso funciona.
Um artigo sobre Java Geek fornece algumas pistas, mas não está perfeitamente claro para mim:

O Java 6 remove o apt e torna o javac capaz de gerenciar anotações, simplificando o processo para obter uma computação de etapa única mais simples. Este é o caminho trilhado por Lombok.

Talvez com Java 6 o processo de compilação seja: javac -> apt -> lombok apt process -> leia arquivos de classe e adicione métodos set / get usando ASM ?

Você poderia me mostrar mais detalhes sobre o mecanismo?

uuidcode
fonte
1
Verifique este artigo: stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

Respostas:

135

Lombok realmente codifica contra API interna, como Sean Patrick Floyd disse. No entanto, como o lombok está SOMENTE envolvido na fase de compilação, é enganoso afirmar que Lombok será executado apenas em uma VM solar. Ele só será compilado em ecj ou javac do sol. No entanto, a grande maioria das VMs existentes no mercado, se é que eles enviam um compilador, é uma dessas duas. Por exemplo, a Apple VM é fornecida com javac de ações e, portanto, o lombok funciona bem em macs. O mesmo vale para a VM de soja, por exemplo.

Embora para javac realmente tenhamos que manter suas atualizações, em parte por causa de muito trabalho em andamento no compilador no momento, tivemos que fazer apenas um pequeno ajuste ao nosso suporte ao eclipse em muitas versões do eclipse. Portanto, enquanto codificamos contra a API interna, eles são bits relativamente estáveis.

Se o que o lombok faz pudesse ser feito sem recorrer à API interna, teríamos feito outra coisa, mas não pode ser feito, por isso recorremos ao uso interno da API.

NB: Eu sou um dos principais desenvolvedores do lombok, então provavelmente sou um pouco tendencioso: P

rzwitserloot
fonte
7
É ótimo ouvir da fonte (+1). Eu admito, minha afirmação sobre correr foi enganosa. Eu quis dizer que o Lombok só pode ser executado em máquinas virtuais da Sun, mas o código resultante é obviamente neutro em termos de plataforma.
Sean Patrick Floyd
Eu meio que me pergunto se o processador de anotação pode delegar tudo ao compilador do eclipse, mesmo que esteja sendo executado via JavaC dessa maneira, havendo apenas um processador para chamar.
Archimedes Trajano
@rzwitserloot: é por isso que eu realmente gosto de SO. Respostas genuínas do próprio core dev.
gaurav
78

Ele usa a API JSR 269 Pluggable Annotation Processing disponível em Java 6.

Observe que lombok.jarcontém um arquivo chamado /META-INF/services/javax.annotation.processing.Processor. Quando javacvê esse arquivo em um caminho de classe de compilação, ele executa processadores de anotação definidos lá durante a compilação.

axtavt
fonte
ótima resposta @axtavt!
gaurav
54

Em adendo à resposta do axtavt: Lombok usa muito mais do que a API JSR 269 expõe. O Lombok codifica contra a) APIs javac internas eb) APIs de eclipse interno (em um processador separado). O JSR 269 não permite modificar o código-fonte existente, mas ao converter um Elementno nó AST subjacente, é possível modificar o AST (que é o projeto do Lombok).

Portanto, o Lombok é um grande hack que só será executado em uma Sun VM (afaik). É um ótimo software, mas também é odiado por muitos por ser um hack tão fora do padrão.

Sean Patrick Floyd
fonte
1
Esta informação ainda é válida?
Ondra Žižka
1
Sim. É verdade, tudo isso.
Sean Patrick Floyd
@SeanPatrickFloyd Adenda: Eu não tive nenhum problema ainda compilando anotações Lombok com OpenJDK 11.
orithena
1
@ orithena sim, isso deve funcionar. a menos que você introduza um segundo processador de anotação e, de repente, encontre condições de corrida porque o Lombok está alterando o AST que o outro processador espera encontrar.
Sean Patrick Floyd
2
Tentarei responder minha própria pergunta, valide quando tiver a chance "Como o Groovy / Kotlin vem com seu próprio compilador, que cuidará da geração do bytecode. Não há necessidade de hackear o processo de geração de bytecode de outro compilador (Java Compiler)."
so-random-dude