我正在尝试使用元编程覆盖 Java 类的私有方法。代码看起来像这样:
// Java class
public class MyClass{
private ClassOfSomeSort property1;
private ClassOfSomeOtherSort property2;
public void init(){
property1 = new ClassOfSomeSort();
property2 = new ClassOfSomeOtherSort();
doSomethingCrazyExpensive();
}
private void doSomethingCrazyExpensive(){
System.out.println("I'm doing something crazy expensive");
}
}
// Groovy class
public class MyClassTest extends Specification{
def "MyClass instance gets initialised correctly"(){
given:
ExpandoMetaClass emc = new ExpandoMetaClass( MyClass, false )
emc.doSomethingCrazyExpensive = { println "Nothing to see here..." }
emc.initialize()
def proxy = new groovy.util.Proxy().wrap( new MyClass() )
proxy.setMetaClass( emc )
when:
proxy.init()
then:
proxy.property1 != null
proxy.property2 != null
}
}
问题是 doSomethingCrazyExpensive 的重写实现没有被调用——我认为这是因为私有方法是由 init() 方法在内部调用的,而不是通过 metaClass 调用的。如果我直接调用 myProxy.doSomethingCrazyExpensive(),则会调用被覆盖的方法,因此元编程在某种程度上确实有效。
有没有办法使用元编程来覆盖 Java 类(或实例)上的方法,以便在内部调用被覆盖的实现时调用它?