Что такое рефлексия в Java и приведи пример её применения?

«Что такое рефлексия в Java и приведи пример её применения?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Рефлексия (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).
  • Стабильность: Ошибки смещаются с этапа компиляции на этап выполнения.