Установить поля объекта из HashMap - PullRequest
19 голосов
/ 17 января 2012

Есть ли библиотека, которая может делать следующее:

Имея Object и HashMap, он перечисляет ключи Hashmap и ищет установщики для этих ключей в Object и устанавливает связанные значения. Что-то похожее на это:

public Object setData(Object object, HashMap<String, Object> fields) {
   for (Entry<String, Object> entry : fields.entrySet()) {
      Method m = object.getClass().getMethod("set" + entry.getKey(), entry.getValue().getClass());
      if (m != null) {
         m.invoke(object, entry.getValue());
      }
   }
   return object;
}

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

Ответы [ 5 ]

19 голосов
/ 17 января 2012

Посмотрите на Apache Commons BeanUtils

org.apache.commons.beanutils.BeanUtils.populate(Object bean, Map properties)

Javadoc:
Заполните свойства JavaBeans указанного компонента на основе указанных пар имя / значение. Этот метод использует API-интерфейсы отражения Java для определения имен соответствующих методов «установщика свойств» и обрабатывает аргументы-установщики типа String, boolean, int, long, float и double.

7 голосов
/ 17 января 2012

Лучше использовать BeanUtils класс:

public Object setData(Object object, HashMap<String, Object> fields) {
   for(Entry<String, Object> entry : fields.entrySet()) {
      BeanUtils.setProperty(object, entry.getKey(), entry.getValue());
   }
   return object;
}
3 голосов
/ 17 января 2012

У меня есть класс BeanAsMap, который я написал давно. Метод asMap возвращает Map, который является представлением Java-бина (POJO). Вы можете позвонить putAll на этот Map, передав ему Map, с которого вы хотите скопировать данные.

Не стесняйтесь использовать мой код, упомянутый выше.

Пример:

MyClass bean = ...;
Map<String, Object> inputData = ...;

Map<String, Object> view = BeanAsMap.asMap(bean);
view.putAll(inputData);
2 голосов
/ 17 января 2012

BeanUtils - это хорошо.

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

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

Такой высокий уровень абстракции затрудняет понимание кода.

Код, который запутывается, будет нарушен самим обфускатором при написании таких вещей.

НаилучшийРешением было бы переосмыслить использование отражения для установки полей объекта.

0 голосов
/ 17 января 2012
...