Каковы некоторые подходящие и неуместные способы использования отражения в Java? - PullRequest
8 голосов
/ 24 июля 2010

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

Ответы [ 4 ]

4 голосов
/ 24 июля 2010

По моему мнению ...

Подходящий (чистый):

  • Создание корневого каталога динамически загруженной реализации, такой как апплет.
  • ИспользованиеProxy для создания прокси или фиктивной реализации (может быть лучше во время компиляции).
  • Реализация интерпретаторов, которые разрешают неограниченный доступ к библиотекам Java.(Обратите внимание, что с точки зрения безопасности интерпретируемый код теперь имеет эффективные привилегии как интерпретатор - это может быть опасно.)

Подходящие хаки:

  • Обход языка Javaэлементы управления доступом в стороннем коде, где вам абсолютно необходимо.
  • Реализация «сквозной задачи», такой как постоянство.
  • Удаление статических зависимостей, которые загружают классы, вызывающие более медленный запуск.

Неуместно:

  • Общие обходы контроля доступа к языку Java (включая тестирование).
  • Все, что зависит от прав доступа к языку Java, предоставляемых конкретным классом вызова-отражения.
  • Везде, где будет работать реализация интерфейса.

Обычно отражение намного проще, чем генерация источника, что намного проще, чем создание байт-кода.

3 голосов
/ 24 июля 2010

Я бы посоветовал взглянуть на книгу: Отражение Java в действии .

Это очень хорошо, подробно и практически полное упоминание об этой продвинутой концепции.

Также это намного больше, чем мы могли бы объяснить здесь, с помощью сценариев, способов использования и концепций, которые впервые становятся понятными, когда вы просто читаете это:).

1 голос
/ 24 июля 2010

Как и с любой технологией, здравый смысл должен быть движущей силой при определении того, какое использование целесообразно.Не «шаблоны», блокирующие способность мозга мыслить.

Не думайте о отражении как о «технологии».Это просто объект метаданных, связанный с любым типом данных и доступный во время выполнения.Простой объект, реализованный оптимально возможным способом (просто подумайте, как бы вы его реализовали, и вы, скорее всего, догадаетесь о фактической реализации).

Из простых соображений ясно, что все методы класса / метода / полятипа 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)

Я не могу придумать пример, в котором я не буду использоватьотражение, просто не используйте его там, где решение на основе метаданных не является оптимальным (просто анализируя, что такое объект метаданных).

0 голосов
/ 20 марта 2013

Я использовал это для определения времени простых бит неизмененного кода для назначения CS. Было три программы поиска простых чисел, для которых мы должны были сравнить время выполнения для 10 равномерно распределенных потолков от 1E5-1E6. Поскольку все они принимали входные данные одинаково (потолок \ n от стандартного ввода), я мог использовать перенаправление stdio, чтобы подать им «клавиатурный» ввод для потолка, угробить вывод и сравнить время выполнения чисто. Конечно, это было возможно только (без изменения кода) с помощью отражения для вызова основных методов. Не модифицированные тестовые программы не были требованием, но я думал, что это будет весело. Тогда я нашел эту тему в поисках г

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...