从HashMap设置对象字段

for*_*ker 20 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;
}
Run Code Online (Sandbox Code Playgroud)

这个任务看起来很简单,但我希望有人已经注意到了一些细微差别.如你所知,重新发明轮子(好轮子)是一种糟糕的方法.

小智 20

看看Apache Commons BeanUtils

org.apache.commons.beanutils.BeanUtils.populate(Object bean, Map properties)
Run Code Online (Sandbox Code Playgroud)

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

  • 警告"只处理类型为String,boolean,int,long,flat和double的setter参数"非常值得注意,因此我相信下面的答案(但使用BeanUtils.copyProperty()而不是BeanUtils.setProperty( ))是更好的选择. (2认同)
  • 使用 lombok 时要小心!如果您生成了带有 chain = true (@Accessors(chain=true) 的访问器,则此解决方案将无法正常工作。因为 BeanUtils 中使用的类需要 setter 为空。请查看此问题以获取更多信息:https://stackoverflow。 com/questions/22743765/beanutils-not-works-for-chain-setter (2认同)

Woj*_*zyk 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;
}
Run Code Online (Sandbox Code Playgroud)