将pojo字段复制到另一个pojo的setter

时间:2013-12-04 08:54:39

标签: java pojo dozer

假设我的课程A包含公开字段xy。让我们说我有另一个pojo类B,但它使用setter和getter,所以它有setX()和setY()。

我想使用一些自动方式从A的实例复制到B并返回。

至少使用默认设置,推土机

   Mapper mapper = new DozerBeanMapper();
   B b = mapper.map(a, B.class);

不会正确复制字段。

那么是否有一个简单的配置更改允许我使用Dozer或其他可以为我完成此操作的库来完成上述操作?

3 个答案:

答案 0 :(得分:4)

我建议你使用:

http://modelmapper.org/

或者看看这个问题:

Copy all values from fields in one class to another through reflection

我会说API(BeanUtils)和ModelMapper都为一个pojos复制pojos值提供单行。看看@ this:

http://modelmapper.org/getting-started/

答案 1 :(得分:1)

实际上不是单行,但这种方法不需要任何库。

我正在使用这些类进行测试:

  private class A {
    public int x;
    public String y;

    @Override
    public String toString() {
      return "A [x=" + x + ", y=" + y + "]";
    }
  }

  private class B {
    private int x;
    private String y;

    public int getX() {
      return x;
    }

    public void setX(int x) {
      System.out.println("setX");
      this.x = x;
    }

    public String getY() {
      return y;
    }

    public void setY(String y) {
      System.out.println("setY");
      this.y = y;
    }

    @Override
    public String toString() {
      return "B [x=" + x + ", y=" + y + "]";
    }
  }

要获取公共字段,我们可以使用反射,对于setter,最好使用bean utils:

public static <X, Y> void copyPublicFields(X donor, Y recipient) throws Exception {
    for (Field field : donor.getClass().getFields()) {
      for (PropertyDescriptor descriptor : Introspector.getBeanInfo(recipient.getClass()).getPropertyDescriptors()) {
        if (field.getName().equals(descriptor.getName())) {
          descriptor.getWriteMethod().invoke(recipient, field.get(donor));
          break;
        }
      }
    }
  }

测试:

final A a = new A();
a.x = 5;
a.y = "10";
System.out.println(a);
final B b = new B();
copyPublicFields(a, b);
System.out.println(b);

它的输出是:

A [x=5, y=10]
setX
setY
B [x=5, y=10]

答案 2 :(得分:1)

对于仍在寻找的人, 您可以使用Gson

尝试一下
Gson gson = new Gson();
Type type = new TypeToken<YourPOJOClass>(){}.getType();
String data = gson.toJson(workingPOJO);
coppiedPOJO = gson.fromJson(data, type);