Для чего нужна рефлексия
Что проверяют
Понимаете ли вы, что рефлексия это доступ к структуре классов во время выполнения, и знаете ли её цену именно на Android: скорость, размер и конфликт с R8. Следом обычно спрашивают, какие известные библиотеки на ней построены, а какие от неё ушли.
Как отвечать
Рефлексия позволяет узнать у объекта класс, поля, методы и аннотации и вызвать их, не зная типа при компиляции. В Java это Class.forName, getDeclaredField, Method.invoke, setAccessible(true) для закрытых членов. В Kotlin есть свой API через KClass, но полный требует библиотеки kotlin-reflect, которая заметно увеличивает APK, поэтому на Android чаще берут Java-рефлексию через ::class.java.
Где она встречается:
- Retrofit: создаёт реализацию вашего интерфейса через динамический прокси
java.lang.reflect.Proxyи читает аннотации@GET,@Queryв рантайме; - Gson и Moshi с
KotlinJsonAdapterFactory: заполняют поля объектов через рефлексию; - тесты и отладка: доступ к закрытому состоянию, когда другого пути нет.
Главное, что стоит сказать: на Android рефлексию стараются заменить генерацией кода. Dagger и Hilt, Room, Moshi с codegen, kotlinx.serialization получают нужный код на этапе сборки через KSP, kapt или плагин компилятора. Это быстрее на старте приложения, ошибки видны при компиляции, а R8 такой код не ломает.
Отдельно про ограничения платформы. С Android 9 доступ через рефлексию к непубличным API (non-SDK interfaces) ограничен: часть полей и методов недоступна, и вызов падает с исключением или пишет предупреждение в лог.
Где спотыкаются
Говорят, что Dagger работает на рефлексии. Dagger генерирует фабрики при компиляции как раз для того, чтобы её избежать.
Забывают про R8. В релизной сборке классы переименовываются и вырезаются, поэтому поиск класса по строке или Gson без правил -keep падает только в release, а в debug всё работает.
Не знают Kotlin-специфики: Gson не видит non-null типов и значений по умолчанию, может создать объект в обход конструктора, и в поле типа String без знака вопроса окажется null.