Что такое рефлексия (Reflection) в Java?

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

Ответ

Рефлексия (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), что нарушает принципы ООП.
  • Стабильность: Код, зависящий от внутренней структуры классов, хрупок и может сломаться при обновлении библиотек.