Spotkałem dzisiaj lomboka .
Bardzo chcę wiedzieć, jak to działa.
Artykuł Java Geek zawiera wskazówki, ale nie jest to dla mnie do końca jasne:
Java 6 usuwa apt i sprawia, że javac może zarządzać adnotacjami, usprawniając proces w celu uzyskania prostszego jednoetapowego przetwarzania. To jest droga, którą obrał Lombok.
Może w przypadku Java 6 proces kompilacji będzie wyglądał następująco: javac -> apt -> lombok apt process -> odczyt plików klas i dodanie metod set / get za pomocą ASM ?
Czy możesz mi pokazać więcej szczegółów na temat mechanizmu?
java
annotations
lombok
uuidcode
źródło
źródło
Odpowiedzi:
Lombok rzeczywiście koduje w oparciu o wewnętrzne API, jak powiedział Sean Patrick Floyd. Ponieważ jednak lombok jest zaangażowany TYLKO w fazie kompilacji, mylące jest twierdzenie, że Lombok będzie działał tylko na Sun VM. Skompiluje się tylko na ecj lub javac słońca. Jednak zdecydowana większość maszyn wirtualnych, jeśli w ogóle dostarczają kompilator, jest jedną z tych dwóch. Na przykład maszyna VM firmy Apple jest dostarczana ze standardowym sun javac i jako taki lombok działa dobrze na komputerach Mac. To samo dotyczy na przykład soylatte VM.
Podczas gdy w przypadku javaca naprawdę musimy trzymać się ich aktualizacji, częściowo z powodu wielu trwających obecnie prac nad ich kompilatorem, musieliśmy wprowadzić tylko jedną niewielką zmianę w obsłudze zaćmień w wielu wielu wersjach zaćmienia. Tak więc, chociaż tworzymy kod w oparciu o wewnętrzne API, są to stosunkowo stabilne bity.
Gdyby to, co robi lombok, można było zrobić bez uciekania się do wewnętrznego API, zrobilibyśmy coś innego, ale nie można tego zrobić, więc uciekamy się do wewnętrznego użycia API.
NB: Jestem jednym z głównych programistów lombok, więc prawdopodobnie jestem trochę stronniczy: P
źródło
Wykorzystuje interfejs API JSR 269 Pluggable Annotation Processing dostępny w Javie 6.
Zauważ, że
lombok.jar
zawiera plik o nazwie/META-INF/services/javax.annotation.processing.Processor
. Gdyjavac
widzi ten plik w ścieżce klas kompilacji, uruchamia procesory adnotacji zdefiniowane tam podczas kompilacji.źródło
W uzupełnieniu do odpowiedzi axtavt: Lombok używa dużo więcej niż api JSR 269 ujawnia. Kody Lombok względem a) wewnętrznego api javac i b) wewnętrznego api zaćmienia (w oddzielnym procesorze). JSR 269 nie pozwala na modyfikowanie istniejącego kodu źródłowego, ale kiedy rzutujesz
Element
do bazowego węzła AST, możesz faktycznie zmodyfikować AST (co robi projekt Lombok).Tak więc Lombok to ogromny hack, który będzie
działałtylko na maszynie wirtualnej Sun (afaik). To świetne oprogramowanie, ale wielu nienawidzi go również za to, że jest tak niestandardowym hackiem.źródło
Projekt Lombok: Tworzenie niestandardowych transformacji jest trochę pomocny.
źródło