1

我有一个对象 A 包含例如:

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

我有一个包含相同元素和字段名称的 B 类:

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

我想在不修改类的情况下将 A 类值复制到 B 类值中。怎么能解决?谢谢。

4

4 回答 4

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
}
于 2013-05-31T16:16:34.513 回答
1

试试这个简单的方法

 firstObj.setElem1 (secObj.getElem1());
于 2013-05-31T16:17:40.877 回答
1

您可以创建第三个类作为工厂,方法将 的实例A作为参数,并返回B.

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

使用外部工厂的好处是将创建B实例的代码与其余代码隔离开来。

于 2013-05-31T16:17:42.583 回答
1

迟到总比没有好,但这是我找到的答案。您可以使用 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
于 2017-03-04T17:06:20.770 回答