我有一个对象A,其中包含例如:
class A{
String elem1;
Int elem2;
...get and set
}
我有一个包含相同元素和字段名称的B类:
class B{
String elem1;
Int elem2;
...get and set
}
我希望将类A值复制到B类值而不修改类。 怎么解决?感谢。
答案 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
}
答案 1 :(得分:1)
您可以创建一个充当工厂的第三个类,其方法是将A
的实例作为参数,并返回B
的实例。
public final class MyFactory
{
public static B createBFromA (A instance)
{
B newInstance = new B ();
newInstance.setXXX (instance.getXXX ());
return newInstance;
}
}
使用外部工厂的优点是将创建B
实例的代码与代码的其余部分隔离开来。
答案 2 :(得分:0)
尝试这种简单的方法
firstObj.setElem1 (secObj.getElem1());
答案 3 :(得分:0)
迟到总比没有好,但这是我找到的答案。您可以使用GSON将Object序列化为String,然后反序列化为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: JSON.test.obj_copy.Obj@22d8cfe0