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

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

  • Аннотации
  • Spring framework (AOP)
  • Hibernate
  • MyBatis

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

Ответ 1

Основная точка: потому что у них нет другого выбора.

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

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

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

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

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

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

Ответ 2

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