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 实例。
假设我有 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 实例。