Как работает ломбок?

148

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

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

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

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

uuidcode
источник
1
Проверьте эту статью: stackextend.com/java/first-step-lombok-annotations
Муад Э.Л. Факир

Ответы:

135

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

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

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

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

rzwitserloot
источник
7
Рад слышать от источника (+1). Признаюсь, мое заявление о беге вводило в заблуждение. Я имел в виду, что Lombok может работать только на виртуальных машинах Sun, но полученный код, конечно, не зависит от платформы.
Шон Патрик Флойд
Я немного удивляюсь, может ли процессор аннотаций делегировать все компилятору eclipse, даже если он запускается через JavaC, так что нужно вызывать только один процессор.
Архимед Траяно
@rzwitserloot: вот почему мне очень нравится ТАК. Подлинные ответы от самого разработчика ядра.
Гаурав
78

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

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

axtavt
источник
отличный ответ @axtavt!
Gaurav
54

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

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

Шон Патрик Флойд
источник
1
Это все еще действительная информация?
Ондра Жижка
1
Ага. Это правда, все это.
Шон Патрик Флойд
@SeanPatrickFloyd Addendum: У меня не было проблем при составлении аннотаций Lombok с помощью OpenJDK 11.
orithena
1
@orithena да, это должно работать. если вы не введете второй процессор аннотаций и вдруг не столкнетесь с условиями гонки, потому что Lombok меняет AST, который ожидает найти другой процессор.
Шон Патрик Флойд
2
Я постараюсь ответить на мой собственный вопрос, пожалуйста, подтвердите, когда у вас появится возможность: «Поскольку Groovy / Kotlin поставляется с собственным полнофункциональным компилятором, который позаботится о генерации байт-кода. Нет необходимости взламывать процесс генерации байт-кода другого компилятора (Java Compiler)».
так случайно-чувак