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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 4

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

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