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

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

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

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

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


person uuidcode    schedule 24.05.2011    source источник
comment
Проверьте эту статью: stackextend.com/java/first-step-lombok-annotations   -  person Mouad EL Fakir    schedule 16.01.2018


Ответы (4)


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

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

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

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

person rzwitserloot    schedule 24.05.2011
comment
Приятно слышать от источника (+1). Признаюсь, мое заявление о беге вводило в заблуждение. Я имел в виду, что Lombok может работать только на виртуальных машинах Sun, но полученный код, конечно, не зависит от платформы. - person Sean Patrick Floyd; 25.05.2011
comment
Мне как бы интересно, может ли процессор аннотаций делегировать все компилятору eclipse, даже если он запускается через JavaC, таким образом, есть только один процессор для вызова. - person Archimedes Trajano; 02.12.2013
comment
@rzwitserloot: вот почему мне ТАК нравится. Правдивые ответы от самого основного разработчика. - person Gaurav; 25.10.2019
comment
Lombok все еще использует внутренние API-интерфейсы или эта ситуация изменилась с 2011 года? В этом комментарии утверждается, что Lombok в наши дни использует официальные API. - person phant0m; 23.03.2021

Он использует JSR 269 Pluggable Annotation Processing API, доступный в Java 6.

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

person axtavt    schedule 24.05.2011

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

Итак, Lombok - это огромный взлом, который будет компилироваться только с использованием компилятора javac или eclipse. Это отличная программа, но многие ненавидят ее за такой нестандартный взлом.

person Sean Patrick Floyd    schedule 24.05.2011
comment
@SeanPatrickFloyd Дополнение: у меня еще не было проблем с компиляцией аннотаций Lombok с помощью OpenJDK 11. - person orithena; 08.04.2019
comment
@orithena, да, это должно сработать. если вы не введете второй процессор аннотаций и внезапно не столкнетесь с условиями гонки, потому что Lombok изменяет AST, который ожидает найти другой процессор. - person Sean Patrick Floyd; 09.04.2019