Як працює ломбок?


148

Сьогодні я зустрів ломбока .
Мені дуже хочеться дізнатися, як це працює.
Стаття Java Geek дає деякі підказки, але мені це не зовсім зрозуміло:

Java 6 видаляє підхожість і робить javac здатним керувати анотаціями, впорядковуючи процес, щоб отримати більш прості обчислення в один крок. Це шлях, який пройшов Ломбок.

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

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


Відповіді:


135

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

Хоча для javac нам дійсно доводиться дотримуватися їх оновлень, почасти через багато поточної роботи над їх компілятором зараз, нам довелося зробити лише 1 незначне коригування нашої підтримки eclipse для багатьох багатьох версій eclipse. Отже, поки ми робимо код проти внутрішнього API, вони є відносно стабільними бітами.

Якщо те, що робить lombok, можна зробити, не вдаючись до внутрішнього API, ми б зробили щось інше, але цього неможливо зробити, тому ми вдаємося до внутрішнього використання API.

NB: Я один з провідних розробників lombok, тому, напевно, я трохи упереджений: P


7
Чудово чути від джерела (+1). Зізнаюся, моя заява про біг була хибною. Я мав на увазі, що Lombok може працювати лише на віртуальних машинах Sun, але отриманий код, звичайно, є платформою нейтральним.
Шон Патрік Флойд

Мені не цікаво, чи може процесор анотацій делегувати все компілятору eclipse, навіть якщо він запускається через JavaC. Таким чином, потрібно викликати лише один процесор.
Архімед Траяно

@rzwitserloot: тому мені дуже подобається ТАК. Справжні відповіді від самого основного розробника.
gaurav

78

Він використовує інтерфейс API для обробки анотацій JSR 269, доступний на Java 6.

Зверніть увагу, що lombok.jarмістить файл з назвою /META-INF/services/javax.annotation.processing.Processor. Коли javacцей файл бачить у класі компіляції, він запускає процесори анотацій, визначені там під час компіляції.


чудова відповідь @axtavt!
gaurav

54

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

Тож Lombok - це величезний хак, який буде запускати компіляцію лише у VM Sun (afaik). Це чудовий фрагмент програмного забезпечення, але його також багато хто ненавидить за те, що він такий нестандартний злом.


1
Це все-таки дійсна інформація?
Ondra Žižka

1
Так. Це правда, все це.
Шон Патрік Флойд

Додаток @SeanPatrickFloyd: У мене ще не було проблем із складанням анотацій Lombok з OpenJDK 11.
orithena

1
@orithena так, це має працювати. якщо ви не введете другий процесор анотацій, і раптом зіткнетеся з перегоновими умовами, оскільки Lombok змінює AST, який очікує знайти інший процесор.
Шон Патрік Флойд

2
Я спробую відповісти на моє власне запитання, будь ласка, підтвердіть, коли ви отримаєте шанс "Оскільки Groovy / Kotlin поставляється зі своїм власним повнорозмірним компілятором, він піклується про генерування байт-коду. Не потрібно зламати процес генерації байтових кодів іншого компілятора (Java Compiler)."
так випадковий чувак

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.