🔥

Тред #4


notion image

Ни для кого не секрет, что кодогенерация используется в некоторых фреймворках. Она позволяет провести инверсию, теперь код пишет не разработчик, а другая программа и отдаёт уже готовый результат, снимая с нас лишние обязанности. youtu.be/rD2Z3Puoo7g

ProcessingEnvironment - это объект, который предоставляем нам классы с помощью которых, мы можем более точно формировать типы для кодогенерации и обрабатывать пришедшее. Очень важной вещью является инкрементальность нашего процессора (лучше смотреть доку) bit.ly/3uu1Zzy

В этот момент можно проводить интроспекцию с помощью Mirror Api, мы можем смотреть какие дженерики, вариативность, ходить по цепочке наследования и так далее. Так же, что самое важное - это то, что мы обрабатываем аннотации, которые объявили в процессоре(или нет)

Начнём с AnnotationProcessor - это абстрактный класс, от которого мы наследуемся и объявляем его в ресурсах. Потом переопределяем метод process и начинаем обрабатывать поступающие на вход файлы(в джаве) или стабы в котлине.

Так же кодогенрацию можно производить с помощью байткод-патчинга с помощью gradle плагина, класслоадера или TransformAction, с этим набором можно не просто генерировать код, но так же и менять уже существующий собственный или код артефактов нашего приложения.

В целом спектр решения задач с помощью кодогенерации очень широк. Это позволяет нам инкапсулировать код, который в целом не нужен для разработки, исключить из проекта вещи, которые постоянно повторяются, а так же облегчить в целом написание кода и снять с себя обязанности.

Сам код проще всего генерировать с помощью KotlinPoet, а патчить байткод или генерировать с помощью ASM asm.ow2.io square.github.io/kotlinpoet/