Ни для кого не секрет, что кодогенерация используется в некоторых фреймворках. Она позволяет провести инверсию, теперь код пишет не разработчик, а другая программа и отдаёт уже готовый результат, снимая с нас лишние обязанности.
youtu.be/rD2Z3Puoo7g
ProcessingEnvironment - это объект, который предоставляем нам классы с помощью которых, мы можем более точно формировать типы для кодогенерации и обрабатывать пришедшее.
Очень важной вещью является инкрементальность нашего процессора (лучше смотреть доку)
bit.ly/3uu1Zzy
В этот момент можно проводить интроспекцию с помощью Mirror Api, мы можем смотреть какие дженерики, вариативность, ходить по цепочке наследования и так далее. Так же, что самое важное - это то, что мы обрабатываем аннотации, которые объявили в процессоре(или нет)
Начнём с AnnotationProcessor - это абстрактный класс, от которого мы наследуемся и объявляем его в ресурсах. Потом переопределяем метод process и начинаем обрабатывать поступающие на вход файлы(в джаве) или стабы в котлине.
Так же кодогенрацию можно производить с помощью байткод-патчинга с помощью gradle плагина, класслоадера или TransformAction, с этим набором можно не просто генерировать код, но так же и менять уже существующий собственный или код артефактов нашего приложения.
В целом спектр решения задач с помощью кодогенерации очень широк. Это позволяет нам инкапсулировать код, который в целом не нужен для разработки, исключить из проекта вещи, которые постоянно повторяются, а так же облегчить в целом написание кода и снять с себя обязанности.
Сам код проще всего генерировать с помощью KotlinPoet, а патчить байткод или генерировать с помощью ASM
asm.ow2.io
square.github.io/kotlinpoet/