将数据复制到不同包中的相同类

时间:2015-12-03 21:18:41

标签: java

我正在调用一个返回以下类的外部服务:

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对象。我不想按字段映射数据字段。我认为它可以通过推土机完成 - 有没有更简单的方法来做呢?

4 个答案:

答案 0 :(得分:1)

Java反射是可行的方法。

来自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);
    }
}

您可以从Oracle查看此tutorial以获取更多详细信息。或者,特别是教程中的page

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