Compile-time рефлексия в Kotlin

На этом докладе мы не будем рассматривать все возможности, которые предоставляет рефлексия Kotlin в общем случае. Мы разберём довольно конкретную задачу «Как найти все классы, помеченные аннотацией и\или имеющие определённый супертип?» (и аналогичную для функций). Такую задачу можно решить несколькими способами, но все они имеют существенные недостатки. Например, стандартная Java рефлексия сильно увеличит время старта приложения. Такие библиотеки, как Classgraph ускорят процесс, но все еще заставят нас постоянно осуществлять поиск по classpath (хоть и оптимизированный). Annotation processing позволит проиндексировать классы во время компиляции, но при этом придется использовать специальные аннотации и усложнять проект.

Во время доклада мы разберем новый подход — плагин для компилятора Kotlin, который позволяет перенести решение этой задачи в compile-time без существенных ограничений и решать ее в run-time за O(1). Кроме того, с помощью него можно решить данную задачу в общем виде и искать сущности по любому (почти) условию. Для начала мы познакомимся с понятием рефлексии в контексте данной задачи и обсудим плюсы и минусы существующих решений. После чего разберёмся, что же такое плагины для Kotlin компилятора, почему именно они могут помочь решить данную задачу эффективно и разберём, как устроен плагин Reflekt, решающий данную задачу. Вместе мы погрузимся во внутренности работы компилятора, разберём все тонкости реализации плагина и не самые очевидные проблемы, возникающие при разработке плагинов, о которых нигде не пишут.


Анастасия Бирилло,

JetBrains Research

Compile-time рефлексия в Kotlin
Анастасия Бирилло,
JetBrains Research
На этом докладе мы не будем рассматривать все возможности, которые предоставляет рефлексия Kotlin в общем случае. Мы разберём довольно конкретную задачу «Как найти все классы, помеченные аннотацией и\или имеющие определённый супертип?» (и аналогичную для функций). Такую задачу можно решить несколькими способами, но все они имеют существенные недостатки. Например, стандартная Java рефлексия сильно увеличит время старта приложения. Такие библиотеки, как Classgraph ускорят процесс, но все еще заставят нас постоянно осуществлять поиск по classpath (хоть и оптимизированный). Annotation processing позволит проиндексировать классы во время компиляции, но при этом придется использовать специальные аннотации и усложнять проект.

Во время доклада мы разберем новый подход — плагин для компилятора Kotlin, который позволяет перенести решение этой задачи в compile-time без существенных ограничений и решать ее в run-time за O(1). Кроме того, с помощью него можно решить данную задачу в общем виде и искать сущности по любому (почти) условию. Для начала мы познакомимся с понятием рефлексии в контексте данной задачи и обсудим плюсы и минусы существующих решений. После чего разберёмся, что же такое плагины для Kotlin компилятора, почему именно они могут помочь решить данную задачу эффективно и разберём, как устроен плагин Reflekt, решающий данную задачу. Вместе мы погрузимся во внутренности работы компилятора, разберём все тонкости реализации плагина и не самые очевидные проблемы, возникающие при разработке плагинов, о которых нигде не пишут.
О докладчике
О докладчике
Работаю программистом-исследователем в JetBrains Research в лаборатории ML4SE (Machine Learning Methods in Software Engineering), преподаю в CSC и СПбГУ.
Все спикеры SnowOne
Все спикеры SnowOne
Показать ещё