我有一个类,我们称之为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中实现吗?答案 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