Подключение к компиляторам Java - PullRequest
6 голосов
/ 04 декабря 2008

У меня есть шаг после компиляции, который манипулирует байт-кодом Java сгенерированных классов. Я хотел бы сделать жизнь потребителей библиотек максимально безболезненной, поэтому я ищу способы сделать этот процесс автоматическим и (если возможно) независимым от компилятора.

API обработки аннотаций предоставляет множество требуемых функций (автоматическое обнаружение служб; поддерживается Eclipse). К сожалению, это нацелено на генераторы кода и не поддерживает манипулирование существующими артефактами :

Исходными данными для инструмента являются считается созданным нулем круглый; поэтому, пытаясь создать исходный файл или файл класса, соответствующий к одному из этих входов приведет FilerException.

Шаблон Decorator, рекомендованный API, не подходит.

Я могу видеть, как выполнить этот шаг с агентом / инструментарием времени выполнения, но это худший вариант, чем шаг ручной сборки, так как для этого потребуется, чтобы кто-то даже не касался API периферийного устройства для настройки своих JVM неочевидным образом .

Есть ли способ подключить или обернуть инструмент компилятора , который вызывается javac ? Кто-нибудь успешно подрывал процессоры аннотаций для манипулирования байт-кодом, независимо от того, что говорит документ?

Ответы [ 2 ]

4 голосов
/ 04 декабря 2008

Компилятор Groovy является единственным компилятором байт-кода, который позволяет подключиться к процессу компиляции (пример: Создать байт-код для поддержки шаблона Singleton )

API обработки аннотаций не предназначен для изменения кода. Как вы уже узнали, все, что вы можете сделать, это установить загрузчик классов, изучить байт-код во время выполнения и манипулировать им. Это мозговая смерть, но это работает. Это следует общей теме «мы боимся, что разработчик может попробовать что-то глупое», которую вы найдете во всей Java. Там нет никакого способа продлить Javac. Соответствующие классы являются либо закрытыми, либо окончательными, либо изменятся в следующей версии Java.

Другой вариант - написать аннотированную Java, например, вы пишете класс «ExampleTpl.java». Затем вы используете прекомпилятор, который расширяет аннотации в этом файле, чтобы получить «Example.java». В остальной части кода вы используете Example и игнорируете ExampleTpl.

Для Eclipse есть отчет об ошибке для автоматизации этого шага . Я не знаю никакой другой работы в этой области.

3 голосов
/ 09 декабря 2008

Это можно сделать.

Взгляните на мой пост в блоге Римскими цифрами, в нашем Java , где для переписывания кода используется процессор аннотаций Ограничением является то, что он работает только с javac от Sun.

...