
Reflection замедляет ваш Java-код. Почему?
spring_aio 22 минуты назад Reflection замедляет ваш Java-код. Почему? Простой 11 мин 1.2K Блог компании Spring АйО Программирование * Java * Kotlin * Обзор Перевод Автор оригинала: Benjamine Evans Reflection — мощный...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: spring_aio 22 минуты назад Reflection замедляет ваш Java-код. 2K Блог компании Spring АйО Программирование * Java * Kotlin * Обзор Перевод Автор оригинала: Benjamine Evans Reflection — мощный механизм, который часто понимают неправильно. Эта статья развивает введение в Core Reflection API, представленное в материале «Reflection for the modern Java programmer», и рассматривает две важные дополнительные темы: как reflection реализован в HotSpot JVM и какие изменения были внесены в reflection в последних версиях платформы Java.
Обсуждение начинается с изучения упрощенной формы кода механизма reflection из JDK. Код в следующих примерах напоминает реализацию в Java 8, но для ясности из него убрана часть сложности. Эта базовая версия используется во всех версиях Java, кроме самых новых.
Технические детали
(В одной из следующих статей будут рассмотрены последние изменения. )Начнем с метода invoke() в Method, который выглядит следующим образом:public Object invoke(Object obj, Object… args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (! quickCheckMemberAccess(clazz, modifiers)) { Class caller = Reflection.
getCallerClass(); checkAccess(caller, clazz, obj, modifiers); } } MethodAccessor ma = methodAccessor; if (ma == null) { ma = acquireMethodAccessor(); } return ma. invoke(obj, args); }Сначала мы проверяем, установлен ли флаг override; он будет установлен, если был вызван setAccessible(). Затем создаем ссылку на объект MethodAccessor, после чего вызов invoke() делегируется ему.
Примечание: многие классы в этом разделе не находятся в API-пакете java. base, поэтому их нельзя вызывать напрямую в современном Java-коде. Например, MethodAccessor находится в jdk.
Отраслевые последствия
Интерфейс MethodAccessor — ключ к возможности рефлексивного вызова. Он выступает в роли простого делегата. public interface При первом вызове этого кода метод acquireMethodAccessor() создает экземпляр типа DelegatingMethodAccessorImpl, который реализует MethodAccessor, следующим образом:import java.
InvocationTargetException; /** Delegates its invocation to another MethodAccessorImpl and can change its delegate at runtime. */ class DelegatingMethodAccessorImpl extends MethodAccessorImpl { private MethodAccessorImpl delegate; DelegatingMethodAccessorImpl(MethodAccessorImpl delegate) { setDelegate(delegate); } public Object invoke(Object obj, Object args) throws void setDelegate(MethodAccessorImpl delegate) { this. delegate = delegate; } }Как написано в комментарии, назначение этого класса — обеспечить нужный уровень абстракции и предоставить точку делегирования, которую можно обновлять во время выполнения.
Начальный делегат — это экземпляр класса NativeMethodAccessorImpl.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





