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?
java
annotations
lombok
uuidcode
fonte
fonte
Respostas:
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
fonte
Ele usa a API JSR 269 Pluggable Annotation Processing disponível em Java 6.
Observe que
lombok.jar
contém um arquivo chamado/META-INF/services/javax.annotation.processing.Processor
. Quandojavac
vê esse arquivo em um caminho de classe de compilação, ele executa processadores de anotação definidos lá durante a compilação.fonte
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
Element
no nó AST subjacente, é possível modificar o AST (que é o projeto do Lombok).Portanto, o Lombok é um grande hack que só será
executadoem uma Sun VM (afaik). É um ótimo software, mas também é odiado por muitos por ser um hack tão fora do padrão.fonte
Projeto Lombok: Criar transformações personalizadas é útil.
fonte