Ответ
Рефлексия (Reflection) в Java — это механизм, позволяющий анализировать и модифицировать структуру и поведение классов, методов, полей и конструкторов во время выполнения программы.
Пример применения: Динамическое создание объекта и вызов его метода по имени.
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 1. Получаем объект Class по имени класса
Class<?> arrayListClass = Class.forName("java.util.ArrayList");
// 2. Создаём экземпляр класса через конструктор по умолчанию
Object listInstance = arrayListClass.getDeclaredConstructor().newInstance();
// 3. Получаем объект Method для метода 'add'
Method addMethod = arrayListClass.getMethod("add", Object.class);
// 4. Динамически вызываем метод на созданном экземпляре
addMethod.invoke(listInstance, "Hello from Reflection!");
System.out.println(listInstance); // Вывод: [Hello from Reflection!]
}
}
Типичные сценарии использования:
- Фреймворки: ORM (Hibernate), Dependency Injection (Spring), сериализаторы.
- Инструменты: Анализ аннотаций, динамическое создание прокси-объектов.
- Тестирование: Доступ к private-методам для модульного тестирования.
Важные ограничения:
- Производительность: Вызовы через Reflection значительно медленнее прямых вызовов.
- Безопасность: Обходит инкапсуляцию, требует соответствующих прав безопасности (SecurityManager).
- Стабильность: Ошибки смещаются с этапа компиляции на этап выполнения.