如何在使用CGLIB时复制私有属性?

时间:2015-02-09 17:20:55

标签: java spring cglib

我有以下示例,我尝试将私有属性从源实例复制到目标实例。

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的情况下复制私有属性?

1 个答案:

答案 0 :(得分:1)

这是不可能的。

我从你提出的问题中提到你创建了一个代理MyClass$EnhancerBySpringCGLIB$someId,它将方法调用委托给另一个MyClass实例?

Java中的字段操作不是动态调度的,即在设置或读取字段时无法触发操作。只有在调用方法时才可以执行此操作。这意味着在设置MyClass时无法设置MyClass$EnhancerBySpringCGLIB$someId字段。

相反,您需要:

  1. 定义用于编写字段的setter。
  2. MyClass$EnhancerBySpringCGLIB$someId不是委托人,而是MyClass的实际替代人。