Рефлексия — это механизм, позволяющий исследовать и изменять структуру и поведение классов, объектов, методов и полей во время выполнения программы. Она реализуется через пакет java.lang.reflect.
Позволяет:
Пример:
import java.lang.reflect.Method; public class ReflectionExample { public void greet() { System.out.println("Hello!"); } public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("ReflectionExample"); Object instance = clazz.getDeclaredConstructor().newInstance(); Method method = clazz.getMethod("greet"); method.invoke(instance); // Выведет: Hello! } }
Плюсы:
Минусы/риски:
Можно ли получить доступ к private-полям и методам класса с помощью рефлексии, и каковы последствия этого?
Ответ: Да, возможно с помощью метода setAccessible(true) у Field или Method:
Field field = clazz.getDeclaredField("privateField"); field.setAccessible(true); field.set(obj, "value");
Это нарушает инкапсуляцию класса и сопряжено с риском: ситуация становится хрупкой, возможны ошибки безопасности, а в новых версиях JVM такие действия могут быть ограничены политиками доступа.
История
В крупном проекте для автоматического маппинга DTO через рефлексию поля с типом "Optional" не учитывались правильно, что приводило к NullPointerException при массовой обработке данных, так как пакет рефлексии не различал Optional-значения и null.
История
В банковском ПО был реализован доступ к приватным полям через setAccessible(true) для сериализации. После обновления JVM поведение поменялось, доступ к приватному полю оказался закрытым, важный функционал сериализации внезапно перестал работать в продакшене.
История
В ORM-фреймворке при генерации proxy-объектов забыл освежить кеш рефлексии после изменения схемы данных. В результате система выдавала непредсказуемые исключения при работе с новыми полями классов, которые не отражались в кеше.