Если отражение в Java замедляет выполнение на порядки, почему так много фреймворков используют его?
Насколько я понимаю, использование API отражения Java замедляет выполнение кода на порядки. Но потом я вижу, что он используется во многих местах вселенной Java. Назвать несколько:
- Аннотации
- Пружинные рамки (АОП)
- зимовать
- MyBatis
Это подразумевает, что есть некоторый факт об java-отражении (он же метод оптимизации), который я упустил. Есть указатели?
2 ответа
Главное: потому что у них нет другого выбора.
Java не является динамическим языком, поэтому единственным способом, которым эти инфраструктуры могут предоставлять свои услуги, является рефлексия.
Во-вторых, обратите внимание, что большая часть работы по отражению, которую выполняет эта структура, происходит только один раз, во время инициализации, поэтому производительность среды выполнения не затрагивается.
О спектакле отражения
Есть одно различие, которое я замечаю, что я все время путаюсь:
- рефлексивный поиск членов;
- доступ к отражающему члену (вызов / чтение / запись).
Номер 1 медленный (это упомянутые вами "заказы"); номер 2 получил значительное улучшение скорости и теперь только в пару раз медленнее, чем собственный доступ.
Как правило, проблемы производительности должны решаться путем профилирования. Оставляя в стороне значительные улучшения производительности отражения, все эти фреймворки подчеркивают одноразовые поиски при запуске (или позже, в случаях отложенной инициализации). В приложениях такого рода, которые их используют, это не очень актуально. Пока invoke
оптимизирован, большая часть штрафа уйдет.