我正在尝试使用元编程覆盖Java类中的私有方法。 代码大致如下:
问题在于doSomethingCrazyExpensive方法的重载实现没有被调用 - 我认为这是因为私有方法在内部被init()方法调用,而不是通过metaClass调用。如果我直接调用myProxy.doSomethingCrazyExpensive(),则会调用重载的方法,因此元编程在某种程度上确实起作用。
有没有一种方法可以使用元编程以覆盖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类(或实例)上的方法,以便在内部调用时调用重载的实现?