Можете ли вы использовать Groovy метапрограммирование для переопределения частного метода в классе Java

Я пытаюсь переопределить закрытый метод в классе 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     
    }
}

Проблема заключается в том, что переопределенная реализация doSomethingCrazyExорого не вызывается - я думаю, что это потому, что закрытый метод вызывается методом init () внутри, а не вызывается через метакласс. Если я вызываю myProxy.doSomethingCrazyExoy () напрямую, вызывается переопределенный метод, поэтому метапрограммирование работает в некоторой степени.

Есть ли способ использовать метапрограммирование для переопределения метода в классе (или экземпляре) Java таким образом, что переопределенная реализация вызывается при его внутреннем вызове?

Ответы на вопрос(4)

Ваш ответ на вопрос