我正在调用一个返回以下类的外部服务:
package abc;
public class FirstClass {
private String name;
private String age;
private String number;
}
在我的模型中,我定义了一个具有相同结构的类:
package xyz;
public class FirstClass {
private String name;
private String age;
private String number;
}
我想将数据从abc.FirstClass
对象复制到xyz.FirstClass
对象。我不想按字段映射数据字段。我认为它可以通过推土机完成 - 有没有更简单的方法来做呢?
答案 0 :(得分:1)
Java反射是可行的方法。
字段是具有关联值的类,接口或枚举。 java.lang.reflect.Field类中的方法可以检索有关该字段的信息,例如其名称,类型,修饰符和注释。还有一些方法可以动态访问和修改字段的值
尝试这样的事情:
StackOverflow.abc.firstClass abc = new StackOverflow.abc.firstClass();
StackOverflow.xyz.firstClass xyz = new StackOverflow.xyz.firstClass();
Class<? extends StackOverflow.xyz.firstClass> xyzClass = xyz.getClass();
Field[] fields = abc.getClass().getDeclaredFields();
for (Field abcField : fields) {
abcField.setAccessible(true); //To access private fields
try {
Field xyzField = xyzClass.getDeclaredField(abcField.getName());
xyzField.setAccessible(true);
xyzField.set(xyz, abcField.get(abc));
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 1 :(得分:1)
无法复制整个类对象的原因是因为每个类对象都有唯一的哈希码。即使你的班级有相同的属性。
我知道这是一种痛苦,但按字段映射是唯一的方法。 您可以尝试使用spring bean来帮助映射字段。
答案 2 :(得分:1)
您可以使用PropertyUtils#copyProperties:
对于属性名称相同的所有情况,将属性值从“origin”bean复制到“destination”bean(即使实际的getter和setter方法可能已通过
BeanInfo
类自定义)。
示例:
abc.FirstClass src = new abc.FirstClass();
xyz.FirstClass dest = new xyz.FirstClass();
PropertyUtils.copyProperties(src, dest);
答案 3 :(得分:0)
您可以使用反射
这可以完成工作并显示出来:
public class FirstClass {
private String name;
private String age;
private String number;
public FirstClass(String _name, String _age, String _number)
{
name=_name; age=_age; number=_number;
}
}
public class CloneClass {
private String name;
private String age;
private String number;
public CloneClass(String _name, String _age, String _number)
{
name=_name; age=_age; number=_number;
}
public void show()
{
System.out.println("NAME="+name+" AGE="+age+" NUMBER="+number);
}
}
FirstClass A=new FirstClass("Jules","44","123A4535");
CloneClass B=new CloneClass("","","");
Class class1=A.getClass();
Class class2=B.getClass();
// all fields from A
Field[] fields_A = class1.getDeclaredFields();
Field[] fields_B = class2.getDeclaredFields();
for (int k=0;k<fields_A.length;k++)
{
Field one_field=fields_A[k];
// Name of field in source
String name_of_field=one_field.getName();
if (name_of_field.equals("this$0")) continue; // Not this !
// Search if it exists in destination
for (int z=0;z<fields_B.length;z++)
{
Field field_destination=fields_B[k];
String name_of_field2=field_destination.getName();
if (name_of_field.equals(name_of_field2))
// TODO
// You should also verify the type !
{
try
{
// To read private var
one_field.setAccessible(true);
field_destination.setAccessible(true);
Object value=one_field.get( A);
field_destination.set(B, value);
}
catch (Exception ex) {System.err.println(ex);}
}
}
} // for (int k=0;k<fields_A.length;k++)
B.show();