Мотивация:
В нашем коде есть несколько мест, где некоторые методы запускаются по их именам. Есть несколько больших if-else-if
блоков с каждым именем функции и вызовом соответствующего метода (я использую термин функция для описания только имен, например, функция X01
может соответствовать методу SomeClass.functionX01
). Я искал способы улучшить это
Цель:
Писать только методы, которые помечены какой-то пользовательской аннотацией, избавляя от необходимости обновлять или даже включать if-else-if
блоков для запуска указанной c функции. Иметь доступ к любому сгенерированному коду, если сгенерирован какой-либо код.
Что я сделал:
Я создал первое подтверждение концепции с использованием аннотаций времени выполнения, и оно оказалось успешным, но медленнее, чем if-else-if
. Следующая попытка была с исходной аннотацией
Для примера я следовал по этой ссылке, однако она не работала в IntelliJ. Я хотел получить класс PersonBuilder
, а не его. В некоторых случаях возникала ошибка Error:java: Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider BuilderProcessor not found
После некоторого поиска в Google и невозможности найти что-либо, что я включил в книгу (Core Java, том II - Расширенные функции - 9-е издание, перевод Poli sh ) и было рекомендовано выполнить следующие команды:
javac [AbstractProcessor implementation]
javac -processor [Compiled Processor] [other source files to compile]
Это сработало, однако неудовлетворительно, поскольку это должно происходить внутри IDE (NetBeans и IntelliJ, которые должны быть указаны c) автоматически во время сборки. Код не должен быть сгенерирован на лету, но программист должен иметь доступ к нему после сборки (как, например, возможность вызывать методы сгенерированных классов)
Вопрос:
Как получить и использовать сгенерированный код, используемый в NetBeans и IntelliJ, без необходимости использования внешних инструментов? Возможно ли это, или использование отражения, аннотаций времени выполнения или внешних инструментов - единственный способ?
Дополнительная информация (на всякий случай):
Уровень языка: Java Версии 1.8
JVM: 12 и 13
IDE: NetBeans и IntelliJ