Ответ
Reflection API — это механизм Java, позволяющий анализировать и модифицировать структуру классов (поля, методы, конструкторы, аннотации) во время выполнения программы.
Основные цели использования:
- Интроспекция: Получение информации о классе по его имени.
- Динамическое создание и управление: Создание объектов, вызов методов и доступ к полям, включая приватные (
private). - Работа с аннотациями: Анализ аннотаций в runtime.
Пример использования:
// 1. Получить объект Class
Class<?> clazz = Class.forName("java.util.ArrayList");
// 2. Создать экземпляр
Object listInstance = clazz.getDeclaredConstructor().newInstance();
// 3. Получить и вызвать метод
Method addMethod = clazz.getMethod("add", Object.class);
addMethod.invoke(listInstance, "Hello, Reflection!");
System.out.println(listInstance); // [Hello, Reflection!]
Типичные сценарии:
- Фреймворки (Spring — DI, Hibernate — ORM, JUnit — запуск тестов).
- Инструменты сериализации/десериализации.
- Интеграционные плагины и IDE.
Важные ограничения:
- Производительность: Операции через Reflection значительно медленнее прямых вызовов.
- Безопасность: Обход инкапсуляции (
setAccessible(true)) может нарушить безопасность. - Сопровождаемость: Код становится менее понятным и зависимым от внутренней структуры классов.
Вывод: Reflection — мощный инструмент для метапрограммирования, но его следует использовать осознанно, только когда статические альтернативы отсутствуют.