Подключение к компиляторам Java
У меня есть шаг после компиляции, который манипулирует байт-кодом Java сгенерированных классов. Я хотел бы сделать жизнь пользователей библиотек максимально безболезненной, поэтому я ищу способы сделать этот процесс автоматическим и (если возможно) независимым от компилятора.
API обработки аннотаций предоставляет множество требуемых функций (автоматическое обнаружение служб; поддерживается Eclipse). К сожалению, это нацелено на генераторы кода и не поддерживает манипулирование существующими артефактами:
Первоначальные входные данные для инструмента считаются созданными нулевым раундом; следовательно, попытка создать файл источника или класса, соответствующий одному из этих входов, приведет к исключению FilerException.
Шаблон Decorator, рекомендованный API, не подходит.
Я могу понять, как выполнить этот шаг с агентом / инструментарием времени выполнения, но это худший вариант, чем шаг ручной сборки, поскольку для этого потребуется, чтобы кто-то даже коснулся API, чтобы сконфигурировать свои JVM неочевидным образом.
Есть ли способ подключить или обернуть инструмент компилятора, как вызвано Javac? Кто-нибудь успешно подрывал процессоры аннотаций для манипулирования байт-кодом, независимо от того, что говорит документ?
2 ответа
Groovy-компилятор является единственным компилятором байт-кода, который позволяет подключиться к процессу компиляции (пример: создание байт-кода для поддержки шаблона Singleton)
API обработки аннотаций не предназначен для изменения кода. Как вы уже узнали, все, что вы можете сделать, это установить загрузчик классов, изучить байт-код во время выполнения и манипулировать им. Это мозговая смерть, но это работает. Это следует общей теме "мы боимся, что разработчик может попробовать что-то глупое", которую вы найдете в Java. Там нет никакого способа продлить Javac. Соответствующие классы являются либо закрытыми, либо окончательными, либо изменятся в следующей версии Java.
Другой вариант - написать аннотированную Java, например, вы пишете класс "ExampleTpl.java". Затем вы используете прекомпилятор, который расширяет аннотации в этом файле, чтобы получить "Example.java". В остальной части кода вы используете Example
и игнорировать ExampleTpl
,
Для Eclipse есть отчет об ошибках, чтобы автоматизировать этот шаг. Я не знаю ни о какой другой работе в этой области.
Это может быть сделано.
Взгляните на мой пост в блоге " Римские цифры", в нашей Java, где для переписывания кода используется процессор аннотаций. Ограничением является то, что он работает только с javac от Sun.