Если отражение в Java замедляет выполнение на порядки, почему так много фреймворков используют его?

Насколько я понимаю, использование API отражения Java замедляет выполнение кода на порядки. Но потом я вижу, что он используется во многих местах вселенной Java. Назвать несколько:

  • Аннотации
  • Пружинные рамки (АОП)
  • зимовать
  • MyBatis

Это подразумевает, что есть некоторый факт об java-отражении (он же метод оптимизации), который я упустил. Есть указатели?

2 ответа

Решение

Главное: потому что у них нет другого выбора.

Java не является динамическим языком, поэтому единственным способом, которым эти инфраструктуры могут предоставлять свои услуги, является рефлексия.

Во-вторых, обратите внимание, что большая часть работы по отражению, которую выполняет эта структура, происходит только один раз, во время инициализации, поэтому производительность среды выполнения не затрагивается.

О спектакле отражения

Есть одно различие, которое я замечаю, что я все время путаюсь:

  1. рефлексивный поиск членов;
  2. доступ к отражающему члену (вызов / чтение / запись).

Номер 1 медленный (это упомянутые вами "заказы"); номер 2 получил значительное улучшение скорости и теперь только в пару раз медленнее, чем собственный доступ.

Как правило, проблемы производительности должны решаться путем профилирования. Оставляя в стороне значительные улучшения производительности отражения, все эти фреймворки подчеркивают одноразовые поиски при запуске (или позже, в случаях отложенной инициализации). В приложениях такого рода, которые их используют, это не очень актуально. Пока invoke оптимизирован, большая часть штрафа уйдет.

Другие вопросы по тегам