メタ プログラミングを使用して 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 クラス (またはインスタンス) のメソッドをオーバーライドする方法はありますか?