簡體   English   中英

將數據復制到不同包中的相同類

[英]Copy data to same classes in different packages

我正在調用一個返回以下類的外部服務:

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對象。 我不想按字段映射數據字段。 我認為它可以通過推土機完成 - 有沒有更簡單的方法來做到這一點?

Java Reflection是要走的路。

來自The Java™Tutorials

字段是具有關聯值的類,接口或枚舉。 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查看本教程以獲取更多詳細信息。 或者,特別是教程中的這個頁面

您無法復制整個類對象的原因是因為每個類對象都具有唯一的哈希碼。 即使你的班級有相同的屬性。

我知道這是一種痛苦,但按字段映射是唯一的方法。 您可以嘗試使用spring bean來幫助映射字段。

您可以使用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);

你可以使用反射

這樣做並顯示出來:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM