从HashMap设置对象字段



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

给定一个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;
}

这项任务乍一看很简单,但其中有些细微之处我希望有人已经处理好了。正如你所知,重新发明轮子(好的轮子)是一种糟糕的方法。

查看Apache Commons BeanUtils

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

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

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

我有一个很久以前写的BeanAsMap类。方法asMap返回一个Map,它是Java bean(POJO)上的一个视图。您可以在该Map上调用putAll,将要从中复制数据的Map传递给它。

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

示例:

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

BeanUtils很好。

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

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

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

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

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

退房http://commons.apache.org/beanutils/,特别是BeanUtils.populate():

http://commons.apache.org/beanutils/v1.8.3/apidocs/index.html

相关内容

  • 没有找到相关文章

最新更新