Работали ли вы с рефлексией в Java
Что проверяют
Понимаете ли вы, на чём держатся Spring, Jackson и JUnit, и осознаёте ли цену механизма: код перестаёт проверяться компилятором, ломается при обфускации и требует отдельной настройки в модульной сборке.
Как отвечать
Рефлексия это чтение метаданных класса во время выполнения и работа с ними: Class, Field, Method, Constructor, аннотации, создание экземпляров и вызовы по имени.
Class<?> cls = Class.forName("com.example.Service");
Object obj = cls.getDeclaredConstructor().newInstance();
Method m = cls.getDeclaredMethod("run", String.class);
m.setAccessible(true);
m.invoke(obj, "arg");Полезно назвать, где вы её встречали не как трюк, а как основу: внедрение зависимостей и создание прокси в Spring, маппинг полей в сериализаторах и в ORM, поиск тестовых методов по аннотациям в JUnit. В прикладном коде рефлексия оправдана редко: обычно задача решается интерфейсом, фабрикой или ServiceLoader, и это честнее признать, чем изображать ежедневное использование. Для горячего участка, где динамика действительно нужна, есть MethodHandles и VarHandle, они быстрее классического invoke.
Где спотыкаются
Считают setAccessible(true) бесплатным. Модульная система закрывает чужие пакеты, и вызов падает на новой версии платформы или в окружении, где модуль не открыт, хотя на машине разработчика всё работало.
Повторяют «рефлексия медленная», не понимая, что именно медленно. Дорого искать метод и поле, а сам вызов после прогрева обходится заметно дешевле. Найденный Method кэшируют, а не ищут заново в цикле.
Забывают про сборку в нативный образ и про обфускацию. Класс, который находят по строковому имени, сборщик считает неиспользуемым и вырезает, а обфускатор переименовывает. Лечится это явной конфигурацией, и знание про такой файл отличает практика от читателя учебника.