从HashMap设置对象字段

时间:2012-01-17 14:06:44

标签: java reflection pojo

是否有可以执行以下操作的库?:

给定一个Object和一个HashMap,它枚举Hashmap的键,并在Object中查找这些键的setter并设置相关的值。看起来像这样:

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 个答案:

答案 0 :(得分:19)

查看Apache Commons BeanUtils

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

的Javadoc:
根据指定的名称/值对填充指定Bean的JavaBeans属性。此方法使用Java反射API来标识相应的“属性设置器”方法名称,并处理String,boolean,int,long,float和double类型的setter参数。

答案 1 :(得分:7)

更好地使用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;
}

答案 2 :(得分:3)

我有很久以前写过的BeanAsMap课程。方法asMap返回Map,它是Java bean(POJO)上的视图。您可以在该putAll上致电Map,并将要传输数据的Map传递给您。

随意使用我上面提到的代码。

示例:

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

Map<String, Object> view = BeanAsMap.asMap(bean);
view.putAll(inputData);

答案 3 :(得分:2)

BeanUtils很好。

但是,作为良好的做法,我不会编写使用反射的代码。或者作为我拥有的最后一个解决方案,如果没有找到其他解决方案。

这个代码无法在像Eclipse这样的IDE中跟踪(没有调用层次结构),这使得开发人员认为永远不会调用setter。他可以破坏你的代码,但仍然可以编译。

这样的抽象级别过高会使代码难以理解。

在编写此类内容时,混淆器本身会破坏被混淆的代码。

最佳解决方案是重新考虑使用反射来设置对象字段。

答案 4 :(得分:0)