Я встретил Ломбок сегодня.
Я очень хочу знать, как это работает.
Статья Java Geek дает некоторые подсказки, но она мне не совсем понятна:
Java 6 удаляет apt и делает javac способным управлять аннотациями, упрощая процесс для получения более простых одношаговых вычислений. Это путь, выбранный Ломбоком.
Может быть, с Java 6 процесс компиляции будет: javac -> apt -> lombok apt process -> читать файлы классов и добавлять методы set / get с использованием ASM ?
Не могли бы вы показать мне больше деталей о механизме?
java
annotations
lombok
uuidcode
источник
источник
Ответы:
Ломбок действительно кодирует внутренний API, как сказал Шон Патрик Флойд. Однако, поскольку lombok участвует ТОЛЬКО на этапе компиляции, вводит в заблуждение утверждение, что Lombok будет работать только на солнечной виртуальной машине . Он будет компилироваться только на ecj или javac от sun. Однако подавляющее большинство виртуальных машин, если они вообще поставляют компилятор, являются одной из этих двух. Например, Apple VM поставляется со стандартным Sun Javac, и как таковой Lombok прекрасно работает на Mac. То же самое касается виртуальной машины Soylatte, например.
В то время как для javac мы действительно должны придерживаться их обновлений, отчасти из-за большой продолжающейся работы над их компилятором прямо сейчас, нам пришлось сделать всего одну незначительную корректировку нашей поддержки eclipse во многих многих версиях eclipse. Итак, хотя мы делаем код против внутреннего API, они являются относительно стабильными битами.
Если бы то, что делает lombok, можно было бы сделать, не прибегая к внутреннему API, мы бы сделали что-то еще, но это невозможно, поэтому мы прибегаем к использованию внутреннего API.
NB: я один из ведущих разработчиков lombok, так что, возможно, я немного предвзят: P
источник
Он использует API-интерфейс обработки вставных аннотаций JSR 269, доступный в Java 6.
Обратите внимание, что
lombok.jar
содержит файл с именем/META-INF/services/javax.annotation.processing.Processor
. Когдаjavac
этот файл видит в пути к классам компиляции, он запускает процессоры аннотаций, определенные там во время компиляции.источник
В добавление к ответу Axtavt: Lombok использует намного больше, чем выставляет API JSR 269. Lombok кодирует против a) внутреннего javac apis и b) внутреннего eclipse apis (в отдельном процессоре). JSR 269 не позволяет вам изменять существующий исходный код, но когда вы преобразуете
Element
его в базовый узел AST, вы можете фактически изменить AST (что и делает проект Lombok).Так что Lombok - это огромный хак, который
запускаеткомпиляцию только на виртуальной машине Sun (afaik). Это отличный программный продукт, но многие его ненавидят за то, что он такой нестандартный хакер.источник
Project Lombok: Создание пользовательских трансформаций является полезным.
источник