У меня есть этап после компиляции, который управляет байт-кодом Java сгенерированных классов. Я хотел бы сделать жизнь пользователей библиотек максимально безболезненной, поэтому я ищу способы сделать этот процесс автоматическим и (если возможно) независимым от компилятора.
API обработки аннотаций предоставляет многие из желаемых функций (автоматическое обнаружение служб; поддерживается Eclipse). К сожалению, это нацелено на генераторы кода и не поддерживает манипуляции с существующими артефактами:
The initial inputs to the tool are considered to be created by the zeroth round; therefore, attempting to create a source or class file corresponding to one of those inputs will result in a FilerException.
Шаблон декоратора, рекомендованный API, не подходит.
Я вижу, как выполнить этот шаг с помощью агента / инструментария среды выполнения, но это худший вариант, чем этап ручной сборки, поскольку он потребует от любого, даже периферийного, затронутого API, настроить свои JVM неочевидным образом.
Есть ли способ подключить или обернуть инструмент компилятора при вызове javac? Кто-нибудь успешно использовал обработчики аннотаций для манипулирования байт-кодом, независимо от того, что говорится в документе?




Компилятор Groovy - единственный компилятор байт-кода, который позволяет подключаться к процессу компиляции (пример: Сгенерируйте байт-код для поддержки шаблона Singleton)
API обработки аннотаций не предназначен для изменения кода. Как вы уже выяснили, все, что вы можете сделать, это установить загрузчик классов, проверить байт-код во время выполнения и управлять им. Это глупо, но это работает. Это следует за общей темой «мы боимся, что разработчик может попробовать что-нибудь глупое», которую вы найдете во всей Java. Нет возможности расширить javac. Соответствующие классы либо частные, либо окончательные, либо изменятся в следующей версии Java.
Другой вариант - написать аннотированный Java, например, вы пишете класс «ExampleTpl.java». Затем вы используете прекомпилятор, который расширяет аннотации в этом файле, чтобы получить «Example.java». В остальной части кода вы используете Example и игнорируете ExampleTpl.
Для Eclipse есть отчет об ошибке для автоматизации этого шага. Мне не известно о какой-либо другой работе в этой области.
Это может быть сделано.
Взгляните на мою запись в блоге Римские цифры в нашей Java, где процессор аннотаций используется для перезаписи кода. Ограничение в том, что он работает только с Sun javac.
Ваша ссылка мертва.