我有一個包含例如一個對象A:複製對象到另一對象的Java
class A{
String elem1;
Int elem2;
...get and set
}
和我有一個包含字段的相同元件和名稱的類B:
class B{
String elem1;
Int elem2;
...get and set
}
我想將類A的值複製到類B的值中而不修改類。 如何解決?謝謝。
我有一個包含例如一個對象A:複製對象到另一對象的Java
class A{
String elem1;
Int elem2;
...get and set
}
和我有一個包含字段的相同元件和名稱的類B:
class B{
String elem1;
Int elem2;
...get and set
}
我想將類A的值複製到類B的值中而不修改類。 如何解決?謝謝。
有沒有「乾淨」的方式來做到這一點;您需要手動複製每個條目。
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
}
copy.elem1 = a.elem1;真的嗎?在大多數情況下,變量是私有的(這是一個很好的編程習慣),你必須使用getters/setters。思考又是如何迴應一切? –
獲取者和設置者僅提供公開可用的信息。如果你正在做一個真正的副本,那麼你可能也需要非公開信息。反思一切的答案 - 不,但這是正確的答案。 – rancidfishbreath
@AniketThakur在這個問題中,這些類沒有getter或setter。無論如何修改這兩行代碼以使用getter和setter會很簡單。 – Vulcan
試試這個簡單的方法
firstObj.setElem1 (secObj.getElem1());
您可以創建第三類將作爲一個工廠,一個方法服用A
實例作爲參數,並返回的B
一個實例。
public final class MyFactory
{
public static B createBFromA (A instance)
{
B newInstance = new B();
newInstance.setXXX (instance.getXXX());
return newInstance;
}
}
使用外部工廠的優點是隔離,從你的代碼的其餘部分爲您創建B
實例代碼。
比從未更好的遲到,但這是我找到的答案。您可以使用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]
,而無需修改哪一類? – mre
http://stackoverflow.com/questions/4394978/copy-fields-between-similar-classes-in-java –
爲什麼你需要這樣的事情。讓這個類實現可複製並克隆它以創建新對象。 –