2011-07-26 55 views
2

我有一个类,让我们叫它水果,我有一个HashMap。我想能够初始化一个新的Fruit实例,但设置为HashMap中的值。因此,例如:如何将HashMap转换为具体的类?

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

然后我想初始化一个新的水果的实例,像这样:

Fruit myFruit = new Fruit(map); 

Fruit myFruit = (Fruit)map; 

这是可能在Java中,通过迭代的方式地图?

+0

我想你的意思是没有编写一个构造函数来从地图中获取值? – Jacob

+0

我的歉意,是的,没有你提到的构造函数。我需要能够迭代地图,并在迭代中设置值。 –

回答

5

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

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

是的,我的意思是使用反射......我的道歉不明确。 –

0

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

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

1

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

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

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

class Fruit{ 

    private Map<String, String> fruitMap; 

    Fruit(Map<String, String> map){ 

    } 

} 
0

假设在map键对应于Fruit类setter方法,你可以使用Apache的bean的实用工具,比如PropertyUtils之一。

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

对于非常复杂的情况你可能想看看Dozer。我们使用Dozer将非常​​大的地图映射到非常大的对象。

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)); 
    } 
} 
+0

aClass.getFields()只有在类的字段不是私有的时才有效? – hwak