Использование Java Reflection для инициализации переменных-членов - PullRequest
0 голосов
/ 09 июня 2009

Я надеюсь, что кто-то может указать некоторую полезную информацию, касающуюся лучших практик, связанных с использованием Reflection в Java.

Текущий проект, который я поддерживаю, использует Oracle ADF Faces, и мы обнаружили, что в зависимости от поставленных целей определенные страницы в конечном итоге содержат огромное количество компонентов, которые необходимо инициализировать в компонентах поддержки. Один из разработчиков в команде разработал решение, использующее отражение в конструкторе bean-компонентов для инициализации всех компонентов-членов для конкретной страницы.

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

Кто-нибудь использовал отражение таким образом? Это приемлемо или разработчики должны вручную написать код?

Ответы [ 5 ]

4 голосов
/ 09 июня 2009

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

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

Если у вас есть решение, которое не использует отражение, используйте его.

1 голос
/ 09 июня 2009

Я обычно выбираю явную инициализацию, используя такую ​​среду, как Spring. Чрезмерное использование рефлексии может привести к коду, который трудно поддерживать или, по крайней мере, трудно читать.

Хотя в современных JVM рефлексия быстрее, но производительность все равно снижается.

0 голосов
/ 09 июня 2009

Я думаю, что ваш естественный уклон против отражения вполне оправдан. Я видел это оскорбленным, и это не красиво.

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

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

0 голосов
/ 09 июня 2009

Зависит от того, как вы используете отражение ...

Отражение против объектов public API (например, использование introspection на бобах) может быть очень полезным и сэкономить много времени для разработчиков.

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

0 голосов
/ 09 июня 2009

Отражение вездесуще в веб-фреймворках. Ориентированные на действие структуры, такие как Struts2, используют отражение для инициализации свойств каждого действия с параметрами из запроса. Реализация JPA, такая как Hibernate, использует отражение для инициализации свойств объектов. Системы внедрения зависимостей, такие как Spring, Pico и Guice, используют отражение для инициализации сложных графов зависимостей для всех видов объектов.

Успех этих проектов показывает жизнеспособность отражения в этом приложении.

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