Как работает ломбок? - PullRequest
124 голосов
/ 24 мая 2011

Я встретил Ломбок сегодня.
Я очень хочу знать, как это работает.
Статья Java Geek дает некоторые подсказки, но это не совсем понятноme:

Java 6 удаляет apt и делает javac способным управлять аннотациями, оптимизируя процесс для получения более простых одношаговых вычислений.Это путь, выбранный Lombok.

Возможно, в Java 6 процесс компиляции будет следующим: javac -> apt -> lombok apt process -> чтение файлов классов и добавление методов set / get с использованием ASM ?

Не могли бы вы показать мне больше деталей о механизме?

Ответы [ 4 ]

117 голосов
/ 25 мая 2011

Lombok действительно кодирует внутренний API, как сказал Шон Патрик Флойд. Однако, поскольку lombok ONLY участвует в фазе компиляции, вводить в заблуждение утверждение о том, что Lombok будет работать только на солнечной виртуальной машине. Он будет компилироваться только на ecj или javac от sun. Однако подавляющее большинство виртуальных машин, если они вообще поставляют компилятор, являются одной из этих двух. Например, Apple VM поставляется со стандартным Sun Javac, и как таковой Lombok прекрасно работает на Mac. Например, то же самое касается виртуальной машины Soylatte.

В то время как для javac мы действительно должны придерживаться их обновлений, отчасти из-за большой продолжающейся работы над их компилятором прямо сейчас, нам пришлось сделать всего одну незначительную корректировку нашей поддержки eclipse во многих многих версиях eclipse , Итак, хотя мы делаем код для внутреннего API, они являются относительно стабильными битами.

Если бы то, что делает lombok, можно было бы сделать, не прибегая к внутреннему API, мы бы сделали что-то еще, но это невозможно, поэтому мы прибегаем к внутреннему использованию API.

NB: я один из ведущих разработчиков lombok, поэтому я, вероятно, немного предвзят: P

64 голосов
/ 24 мая 2011

Используется API-интерфейс обработки сменных аннотаций JSR 269 , доступный в Java 6.

Обратите внимание, что lombok.jar содержит файл с именем /META-INF/services/javax.annotation.processing.Processor.Когда javac видит этот файл в пути к классам компиляции, он запускает процессоры аннотаций, определенные там во время компиляции.

43 голосов
/ 24 мая 2011

В добавлении к ответу axtavt: Lombok использует гораздо больше, чем предоставляет API JSR 269. Ломбок кодирует против a) внутреннего javac apis и b) внутреннего eclipse apis (в отдельном процессоре). JSR 269 не позволяет вам изменять существующий исходный код, но когда вы приводите Element к базовому узлу AST, вы можете фактически изменить AST (что и делает проект Lombok).

Итак, Lombok - это огромный хак, который только запустит компиляцию на Sun VM (afaik). Это отличный программный продукт, но многие его ненавидят за то, что он такой нестандартный взлом.

42 голосов
/ 25 мая 2011
...