2013-05-31 75 views
1

我有一個包含例如一個對象A:複製對象到另一對象的Java

class A{ 
    String elem1; 
    Int elem2; 
    ...get and set 
} 

和我有一個包含字段的相同元件和名稱的類B:

class B{ 
    String elem1; 
    Int elem2; 
    ...get and set 
} 

我想將類A的值複製到類B的值中而不修改類。 如何解決?謝謝。

+0

,而無需修改哪一類? – mre

+1

http://stackoverflow.com/questions/4394978/copy-fields-between-similar-classes-in-java –

+0

爲什麼你需要這樣的事情。讓這個類實現可複製並克隆它以創建新對象。 –

回答

4

有沒有「乾淨」的方式來做到這一點;您需要手動複製每個條目。

A a = ...; 
B copy = new B(); 
copy.elem1 = a.elem1; 
copy.elem2 = a.elem2; 

或者,你可以使用反射,但它的性能和成本有些不清楚,如果有類字段定義之間的任何矛盾都將失敗。

A a = ...; 
B copy = new B(); 
for (Field field : a.getClass().getDeclaredFields()) { 
    Field copyField = copy.getClass().getDeclaredField(field.getName()); 
    field.setAccessible(true); 
    copyField.setAccessible(true); 
    if (!field.getType().isPrimitive()) { 
     Object value = field.get(a); 
     field.set(copy, value); 
    } else if (field.getType().equals(int.class)) { 
     int value = field.getInt(a); 
     field.setInt(copy, value); 
    } else if { ... } // and so forth 
} 
+0

copy.elem1 = a.elem1;真的嗎?在大多數情況下,變量是私有的(這是一個很好的編程習慣),你必須使用getters/setters。思考又是如何迴應一切? –

+1

獲取者和設置者僅提供公開可用的信息。如果你正在做一個真正的副本,那麼你可能也需要非公開信息。反思一切的答案 - 不,但這是正確的答案。 – rancidfishbreath

+0

@AniketThakur在這個問題中,這些類沒有getter或setter。無論如何修改這兩行代碼以使用getter和setter會很簡單。 – Vulcan

0

試試這個簡單的方法

firstObj.setElem1 (secObj.getElem1()); 
1

您可以創建第三類將作爲一個工廠,一個方法服用A實例作爲參數,並返回的B一個實例。

public final class MyFactory 
    { 
    public static B createBFromA (A instance) 
     { 
     B newInstance = new B(); 
     newInstance.setXXX (instance.getXXX()); 
     return newInstance; 
     } 
    } 

使用外部工廠的優點是隔離,從你的代碼的其餘部分爲您創建B實例代碼。

0

比從未更好的遲到,但這是我找到的答案。您可以使用GSON的對象序列化到字符串,然後反序列化到B類下面是測試的例子:

package JSON.test.obj_copy; 
public class TestClassA { 

    private String field1 = "pikachu"; 
    private Integer field2 = 1; 
    private List<String> field3 = new ArrayList<String>(Arrays.asList("A", "B", "C")); 
    private Obj field4 = new Obj(); 

    @Override 
    public String toString(){ 
     return new StringBuilder("field1: " + field1 + "\n") 
       .append("field2: " + field2 + "\n") 
       .append("field3: " + field3 + "\n") 
       .append("field4: " + field4) 
       .toString(); 
    } 
} 

public class TestClassB { 

    private String field1; 
    private Integer field2; 
    private List<String> field3; 
    private Obj field4; 

    @Override 
    public String toString(){ 
     return new StringBuilder("field1: " + field1 + "\n") 
       .append("field2: " + field2 + "\n") 
       .append("field3: " + field3 + "\n") 
       .append("field4: " + field4) 
       .toString(); 
    } 
} 

public class Obj { 
} 

public class MainObjCopy { 

    public static void main(String[] args){ 

     TestClassA a = new TestClassA(); 
     TestClassB b; 
     Gson g = new Gson(); 
     String s1 = g.toJson(a); 
     b = g.fromJson(s1, TestClassB.class); 

     System.out.println(b); 
    } 
} 

輸出:

field1: pikachu 
field2: 1 
field3: [A, B, C] 
field4: [email protected] 
相關問題