我有一张带有键和字符串值的地图 此Map已构建为读取资源包,其中数据按以下方式组织:
height=160
weight=80
name=bob
我有一个人类,其中包含以下字段:身高,体重和姓名。
class Person{
int height;
int weight;
String name;
//..getter and setter..
}
我想从Map创建一个Person类的实例:height:160,weight:80,name:bob 最好的是通用解决方案,或使用某些实用程序的东西。
你知道吗?我怎么能用Java做到这一点?或者使用框架Spring?答案 0 :(得分:5)
如果您想使用Spring中的某些内容,请查看Spring BeanWrapper接口及其实现。您可以使用它来包装bean并从以下地图动态填充bean:
Map<String, String> properties = new HashMap<>();
properties.put("height", "160");
properties.put("weight", "80");
properties.put("name", "bob");
BeanWrapper person = new BeanWrapperImpl(new Person());
for (Map.Entry<String, String> property : properties.entrySet()) {
person.setPropertyValue(property.getKey(), property.getValue());
}
System.out.println(person.getWrappedInstance().toString());
这将打印:
-> Person [height=160, weight=80, name=bob]
答案 1 :(得分:1)
经典的Java方法是将值Map作为参数传递给Person的构造函数,让人从地图中读取属性。
通过这种方式,您可以使用多种方法构建Person对象。通过直接传递参数或传递地图。
我想提出这种方法的另一个好处。如果你这样做,凝聚力非常高。这意味着如何从值的Map构造Person对象的知识在类本身内编码。如果您要在类之外执行此操作,并且希望在程序的不同位置构造Person对象,则需要复制代码以从映射中获取值或将其抽象为实用程序方法。现在你没有,如果你们每个人都需要改变如何构建Person对象的方法,你只需在一个地方改变它。
import java.util.Map;
public class Person {
private static final String WEIGHT_PROPERTY = "weight";
private static final String HEIGHT_PROPERTY = "height";
private final int height;
private final int weight;
public Person(Map<String, String> map){
height = Integer.parseInt(map.get(HEIGHT_PROPERTY));
weight = Integer.parseInt(map.get(WEIGHT_PROPERTY));
}
public int getHeight() {
return height;
}
public int getWeight() {
return weight;
}
}
答案 2 :(得分:1)
简化@Jeroen Peeters帖子
public class Person {
Map<String, String> prop;
public Person(Map<String, String> map){
prop = map
}
public int getHeight() {
return Integer.parseInt(prop.get("height"))
}
public int getWeight() {
return Integer.parseInt(prop.get("weight"));
}
}
答案 3 :(得分:0)
Map<String, String> map = ...;
int height = Integer.parseInt(map.get("height"));
int weight = Integer.parseInt(map.get("weight"));
Person p = new Person(height, weight);
请注意,ResourceBundle通常用于处理国际化。如果您只需要阅读属性,请使用java.util.Properties
类。
答案 4 :(得分:0)
最简单的方法是使用杰克逊的ObjectMapper类。
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> fields = ...;
Person o = mapper.convertValue (fields, Person.class);