объект, созданный с помощью ключевого слова "new" и созданный с отражением - PullRequest
3 голосов
/ 20 января 2010

Я узнал, что с помощью Reflection мы можем создавать объекты, не используя ключевое слово «new». Поэтому я хотел знать, есть ли в них различия или какие-то конкретные сценарии использования Reflection. Потому что до сих пор я не создавал и не видел ни одного кода, создающего объект с отражением.

Почему использование 'new' стало таким распространенным, а отражение - нет.

Ответы [ 7 ]

9 голосов
/ 20 января 2010

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

3 голосов
/ 20 января 2010

Почему использование 'new' стало таким отражения нет.

По сравнению с ключевым словом "new" использование рефлексии - большая работа; это также приводит к менее читаемому коду.

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

2 голосов
/ 20 января 2010

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

1 голос
/ 20 января 2010

В пользу new:

  1. Это намного быстрее, чем отражение.
  2. Это приводит к намного более чистому коду, который легче поддерживать.
  3. Отражение небезопасно.
  4. Из-за # 3 IDE с поддержкой рефакторинга (например, Eclipse) не могут хорошо обрабатывать отражение.

В пользу рефлексии:

  1. Это единственный вариант, когда вы не знаете тип класса, который хотите создать во время компиляции.

Итак, как вы можете видеть, new - это то, что вы хотите использовать в 99% случаев. Отражение используется внутри определенных платформ, таких как макеты фиктивных объектов, каркасы внедрения зависимостей или интерфейсы поставщика услуг (SPI). В большинстве случаев вы будете пользователем этих вещей, но не будете писать их сами.

Кстати, если вы все еще хотите использовать отражение, существуют инструменты, которые делают создание экземпляров объектов посредством отражения менее болезненным: objenesis приходит на ум.

1 голос
/ 20 января 2010

Предположим, вы хотите создать экземпляр класса MyObject, используя конструктор, который принимает один аргумент типа String. С new:

MyObject myObject = new MyObject("constructor-arg1");

С отражением:

Constructor constructor = MyObject.class.getConstructor(String.class);

MyObject myObject = (MyObject) constructor.newInstance("constructor-arg1");

(пример украден у http://tutorials.jenkov.com/java-reflection/constructors.html)

Должно быть понятно, что первое более читабельно и быстрее печатается. Кроме того, размышление часто мучительно медленно. С другой стороны, отражение позволяет создавать экземпляры объектов, не зная их класса во время компиляции.

В заключение, используйте отражение только тогда, когда у вас нет других альтернатив ...

1 голос
/ 20 января 2010

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

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

0 голосов
/ 20 января 2010

Для более реального примера тяжелого использования это в весенних рамках. В котором мы определим зависимые объекты и их взаимодействующие классы в xml, а контейнер на самом деле создаст их экземпляры, используя отражение, и даже вызовет методы жизненного цикла, используя отражение и передачу созданного объекта. Это один типичный сценарий, где вы будете использовать. Также, если вы посмотрите на большинство решений BRMS, они используют отражение для запуска методов бизнес-правил во время выполнения с использованием отражения. Хотя в реальном мире каждый день использование отражения для создания объектов невелико, еще одно место, где вы используете какое-то отражение, - это использование JDBC (Class.forName ("класс драйвера")).

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