Подключение к компиляторам Java

У меня есть этап после компиляции, который управляет байт-кодом 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? Кто-нибудь успешно использовал обработчики аннотаций для манипулирования байт-кодом, независимо от того, что говорится в документе?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
0
820
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

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

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

Ваша ссылка мертва.

Ben Leggiero 14.03.2016 20:24

Другие вопросы по теме