Как и с любой технологией, здравый смысл должен быть движущей силой при определении того, какое использование целесообразно.Не «шаблоны», блокирующие способность мозга мыслить.
Не думайте о отражении как о «технологии».Это просто объект метаданных, связанный с любым типом данных и доступный во время выполнения.Простой объект, реализованный оптимально возможным способом (просто подумайте, как бы вы его реализовали, и вы, скорее всего, догадаетесь о фактической реализации).
Из простых соображений ясно, что все методы класса / метода / полятипа get -thing-by-name вызывают поиск по карте / индексу каждый раз, когда они вызываются, поэтому эту операцию несколько стоит выполнить только один раз в жизни приложения.Но, как только он получен, производительность метода method.invoke (object, args) почти такая же, как и у object.method (args), потому что он вводит только еще один уровень косвенности, не требующий каких-либо дополнительных поисков.
Примеры, где я бы использовал подход, основанный на отражении:
инициализация / копирование / сериализация / печать свойств бина по имени, эта задача возникает в большинстве бизнес-приложений и, как только вы используете динамическийпрограммирование (то есть поиск по имени только один раз для инициализации преобразователей / загрузчиков и последующего применения одного и того же преобразователя в течение всего срока службы приложения) добавляет незначительных накладных расходов, но добавляет отличную гибкость программному обеспечению (см. commons-beanutils, внедрение зависимостей пружин).
транзакция / сеанс / авторизация / метрика / фиктивные прокси (с использованием API-интерфейса Dynamic Proxy из JDK)
- удобная альтернатива XSD, устраняющая синтаксический анализатор XML (с использованием JPA / JAXB/ WS / JAXB и любые другие аннотации) для хранения дополнительной информации окак объект должен сохраняться, какие графические метки должны отображаться для каждого поля и т. д. (см. jax-ws, hibernate)
Я не могу придумать пример, в котором я не буду использоватьотражение, просто не используйте его там, где решение на основе метаданных не является оптимальным (просто анализируя, что такое объект метаданных).