Ответ
Рефлексия (Reflection) в Java — это механизм, позволяющий программе исследовать и модифицировать свою собственную структуру и поведение во время выполнения. Доступ к нему предоставляется через API пакета java.lang.reflect.
Основные возможности
- Получение информации о классе: поля, методы, конструкторы, аннотации.
- Создание экземпляров классов динамически.
- Вызов методов и доступ к полям (включая приватные).
- Анализ и создание массивов.
Пример использования
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// Получаем объект Class
Class<?> stringClass = String.class;
// Получаем все объявленные методы
Method[] methods = stringClass.getDeclaredMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
// Динамически создаем экземпляр и вызываем метод
Class<?> clazz = Class.forName("java.util.ArrayList");
Object list = clazz.getDeclaredConstructor().newInstance();
Method addMethod = clazz.getMethod("add", Object.class);
addMethod.invoke(list, "Hello, Reflection!");
System.out.println(list); // [Hello, Reflection!]
}
}
Области применения
- Фреймворки: Spring (DI, аннотации), Hibernate (ORM), JUnit.
- Инструменты: Сериализаторы (Jackson, Gson), IDE, отладчики.
- Динамический код: Плагины, скриптовые движки.
Недостатки и предостережения
- Производительность: Вызовы через Reflection значительно медленнее прямых вызовов.
- Безопасность: Требует специальных runtime-разрешений (
SecurityManager). - Инкапсуляция: Позволяет обходить модификаторы доступа (private), что нарушает принципы ООП.
- Стабильность: Код, зависящий от внутренней структуры классов, хрупок и может сломаться при обновлении библиотек.