假设我的课程A
包含公开字段x
和y
。让我们说我有另一个pojo类B
,但它使用setter和getter,所以它有setX()和setY()。
我想使用一些自动方式从A
的实例复制到B
并返回。
至少使用默认设置,推土机
Mapper mapper = new DozerBeanMapper();
B b = mapper.map(a, B.class);
不会正确复制字段。
那么是否有一个简单的配置更改允许我使用Dozer或其他可以为我完成此操作的库来完成上述操作?
答案 0 :(得分:4)
我建议你使用:
或者看看这个问题:
Copy all values from fields in one class to another through reflection
我会说API(BeanUtils)和ModelMapper都为一个pojos复制pojos值提供单行。看看@ this:
答案 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);