我有以下示例,我尝试将私有属性从源实例复制到目标实例。
public class MyClass {
public void cloneTo(MyClass target) {
target.identifier = this.identifier; // identifier is not null
System.out.println(target.getIdentifier()) // problem: prints null
}
}
此代码通常应该有效,但问题是MyClass
实例是CGLIB
代理:MyClass$EnhancerBySpringCGLIB$someId
,在这种情况下,代理中未设置标识符属性目标类,所以当我调用getIdentifier()
时,它返回null而不是标识符。
是否可以在不为每个属性创建getter / setter的情况下复制私有属性?
答案 0 :(得分:1)
这是不可能的。
我从你提出的问题中提到你创建了一个代理MyClass$EnhancerBySpringCGLIB$someId
,它将方法调用委托给另一个MyClass
实例?
Java中的字段操作不是动态调度的,即在设置或读取字段时无法触发操作。只有在调用方法时才可以执行此操作。这意味着在设置MyClass
时无法设置MyClass$EnhancerBySpringCGLIB$someId
字段。
相反,您需要:
MyClass$EnhancerBySpringCGLIB$someId
不是委托人,而是MyClass
的实际替代人。