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

JAVA How to change instance fields values without copying new instance reference

假设我有 class A

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

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

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

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

我在想是否有一些方法可以超越反射?

有人对此有一些经验吗?

您可以使用

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

here

根据需要,您需要考虑很多事情,并且可以通过多种方式来实现。使用反射你可以像这样

    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 相同的引用。这意味着如果你的 class A 有一个对象字段 class B 像这样

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

那么在你创建了一个重复的a2之后,改变b对象的myString将会反映到a1和a2。发生这种情况是因为 a1 和 a2 都引用了同一个 B 实例。