Können Sie die Groovy-Metaprogrammierung verwenden, um eine private Methode in einer Java-Klasse zu überschreiben?

Ich versuche, eine private Methode in einer Java-Klasse mithilfe von Metaprogrammierung zu überschreiben. Der Code sieht ungefähr so aus:

// 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     
    }
}

Das Problem ist, dass die überschriebene Implementierung von doSomethingCrazyExpensive nicht aufgerufen wird - ich denke, das liegt daran, dass die private Methode intern von der init () -Methode aufgerufen wird und nicht über die MetaClass aufgerufen wird. Wenn ich myProxy.doSomethingCrazyExpensive () direkt aufrufe, wird die überschriebene Methode aufgerufen, sodass die Metaprogrammierung bis zu einem gewissen Grad funktioniert.

Gibt es eine Möglichkeit, mithilfe der Metaprogrammierung eine Methode in einer Java-Klasse (oder -Instanz) so zu überschreiben, dass die überschriebene Implementierung aufgerufen wird, wenn sie intern aufgerufen wird?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage