从Map创建Object实例

时间:2013-11-29 16:27:18

标签: java spring spring-mvc map bundle

我有一张带有键和字符串值的地图 此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?

5 个答案:

答案 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);