Ответ
Reflection API — это набор классов в Java (java.lang.reflect и java.lang.Class), который позволяет программе анализировать и модифицировать свое собственное поведение во время выполнения (runtime).
Основные возможности:
- Интроспекция: получение информации о классе, его полях, методах, конструкторах, аннотациях.
- Манипуляция: создание экземпляров классов, вызов методов, получение и установка значений полей, в том числе
private.
Пример анализа класса:
Class<?> stringClass = String.class;
// Получаем все объявленные методы
Method[] methods = stringClass.getDeclaredMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
// Динамически создаем экземпляр и вызываем метод
Constructor<?> constructor = stringClass.getConstructor(String.class);
Object strInstance = constructor.newInstance("Hello");
Method lengthMethod = stringClass.getMethod("length");
int len = (int) lengthMethod.invoke(strInstance); // len = 5
Типичные случаи использования:
- Фреймворки (Spring для DI, Hibernate для ORM).
- Инструменты тестирования (JUnit, Mockito).
- Сериализация/десериализация.
- Интегрированные среды разработки (IDE).
Недостатки и риски:
- Производительность: операции через Reflection значительно медленнее прямых вызовов.
- Безопасность: обход инкапсуляции может нарушить целостность объекта.
- Сложность поддержки: код с Reflection менее читаем и подвержен ошибкам времени выполнения.
- Ограничения модульной системы (JPMS): требуются дополнительные разрешения.