JAVA如何在不复制新实例引用的情况下更改实例字段值

时间:2015-02-04 09:09:11

标签: java field instance

假设我有A级

public class A {
    private int field1;
    private String field2;
    ...
}

我创建了一个新的A实例,然后是第二个实例:

A a1 = new A();
A a2 = new A();

是否有任何简单的方法(反思等)将字段从a2复制到a1,而无需将实例a2分配给a1(我不想更改实例a1的引用,只有其字段的值)?我知道我可以用某种方法手动完成它,但是如果有很多字段,它有点不实用。

我在想是否有某种方式可以反思?

任何人都有一些经验吗?

2 个答案:

答案 0 :(得分:4)

您可以使用

org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)

请参阅here

答案 1 :(得分:1)

您需要考虑许多事项,并根据要求采取多种方法。使用反射你可以做这样的事情

    A a1  //the original a
    A a2 = new A();  //the "duplicate"

    Field[] fields = A.class.getDeclaredFields();
    for (Field f : fields){
        f.setAccessible(true); //need that if the fields are not 
        //accesible i.e private fields
        f.get(a1);
        f.set(a2, f.get(a1));
    }

请注意,a2 不是a1的深层副本 ,但它已经分配了相同的a1引用。这意味着如果您的A类具有类似B的对象字段

    class A { 
          B b;
    }
    class B { 
        public String myString;
    }

然后在创建了一个dublicate a2后,更改b对象的myString将反映到a1和a2。这是因为a1和a2都引用了同一个B实例。