如何将HashMap强制转换为具体类?

时间:2011-07-26 19:54:18

标签: java

我有一个类,我们称之为Fruit,我有一个HashMap。我希望能够初始化Fruit的新实例,但设置为HashMap中的值。例如:

Map<String, String> map = new HashMap<String, String>();
map.put("name", "Banana");
map.put("color", "Yellow");

然后我想初始化一个新的Fruit实例,如下所示:

Fruit myFruit = new Fruit(map);

Fruit myFruit = (Fruit)map;

通过迭代Map?

可以在Java中实现吗?

10 个答案:

答案 0 :(得分:9)

第二个是不可能的,因为HashMap不是Fruit。您可以通过提供带有Map<String, String>参数的构造函数来完成第一个。

public Fruit(Map<String, String> map) {
  this.name = map.get("name");
  this.color = map.get("color");
}

答案 1 :(得分:2)

您似乎可以使用反射

Fruit f = new Fruit();
Class aClass = f.getClass();
for(Field field : aClass.getFields()){
  if(map.containsKey(field.getName())){
    field.set(f,map.get(field.getName()));
  }
}

答案 2 :(得分:1)

是的,这是可能的。但是你必须为Fruit编写一个构造函数,它知道如何从地图中提取值和值。

public Fruit(Map params) {
    this.setColor(map.get("color"));
    this.setName(map.get("name"));
}

答案 3 :(得分:1)

有点老,但是:

import com.fasterxml.jackson.databind.ObjectMapper;
...
final ObjectMapper mapper = new ObjectMapper();
final Map myObjectMapped = new HashMap();
//fill map
final Class clazz = Class.forName(MyClassToBeConverted.class.getName());
final MyClassToBeConverted convertedObj = (MyClassToBeConverted) mapper.convertValue(myObjectMapped, clazz);
...

答案 4 :(得分:0)

您将在构造函数中遍历地图并分配值。如果有一个实际的库来做这件事(几乎像一个Bean),那么我从未听说过它。

将HashMap转换为水果是不可能的。

答案 5 :(得分:0)

第二个是不可能的,但你可以创建一个将Map作为构造函数参数的类。

class Fruit{

  private Map<String, String> fruitMap;

  Fruit(Map<String, String> map){

  }

}

答案 6 :(得分:0)

假设map中的键对应Fruit类中的setter方法,您可以使用Apache bean的一个实用程序,如PropertyUtils

final Fruit f = new Fruit();
for(String key : map.keySet()) {
    PropertyUtils.setProperty(fruit, key, map.get(key));
}

答案 7 :(得分:0)

对于非常复杂的情况,您可能需要查看Dozer。我们使用Dozer将非常​​大的地图映射到非常大的对象。

答案 8 :(得分:0)

我已经修复了Anni的解决方案,现在它支持继承以及静态和最终字段。 顺便说一句,我还没有检查类型不匹配。

public static void populateBean(Object bean, Map<String, Object> properties) throws Exception {
    Class<?> clazz = bean.getClass();
    while(clazz != null) {
        for (Field field : clazz.getDeclaredFields()) {
            int modifiers = field.getModifiers();
            if (!Modifier.isStatic(modifier) && !Modifier.isFinal(modifier)) {
                if (map.containsKey(field.getName())) {
                    field.accessible(true);
                    field.set(bean, map.get(field.getName()));
                }
            }
        }
        clazz = clazz.getSuperclass();
    }
}

顺便说一句,Apache BeanUtils DynaBeans几乎可以满足您的要求,据我所知它支持Java Beans自省。

答案 9 :(得分:0)

也许与其他解决方案相比要慢一些,但是出于不苛刻的目的,我的代码对我来说很好用(而且非常简单和干净):

public class Utils {
    static Object parseHashMapToObject(HashMap map, Class cls) {
        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gson = gsonBuilder.create();
        String jsonString = gson.toJson(map);
        return gson.fromJson(jsonString, cls);
    }
}

Gson Github:https://github.com/google/gson