Jak działa lombok?


148

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?


Odpowiedzi:


135

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


7
Dobrze słyszeć od źródła (+1). Przyznaję, że moje oświadczenie o bieganiu było mylące. Miałem na myśli, że Lombok może działać tylko na maszynach wirtualnych Sun, ale wynikowy kod jest oczywiście neutralny dla platformy.
Sean Patrick Floyd

W pewnym sensie zastanawiam się, czy procesor adnotacji może delegować wszystko do kompilatora eclipse, nawet jeśli jest uruchamiany przez JavaC, w ten sposób można wywołać tylko jeden procesor.
Archimedes Trajano

@rzwitserloot: dlatego bardzo lubię SO. Prawdziwe odpowiedzi od samego głównego programisty.
gaurav


54

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 Elementdo 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.


1
Czy to nadal aktualne informacje?
Ondra Žižka

1
Tak. To prawda, wszystko.
Sean Patrick Floyd

@SeanPatrickFloyd Dodatek: Nie miałem jeszcze problemów z kompilacją adnotacji Lombok z OpenJDK 11.
orithena

1
@orithena tak, to powinno działać. chyba że wprowadzisz drugi procesor adnotacji i nagle napotkasz warunki wyścigu, ponieważ Lombok zmienia AST, który inny procesor spodziewa się znaleźć.
Sean Patrick Floyd

2
Spróbuję odpowiedzieć na własne pytanie, sprawdź, kiedy nadarzy się okazja. „Ponieważ Groovy / Kotlin ma swój własny pełnowartościowy kompilator, który zajmie się generowaniem kodu bajtowego. Nie ma potrzeby hakowania procesu generowania kodu bajtowego innego kompilatora (kompilatora Java)”.
so-random-dude

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.