Можете ли вы использовать 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 таким образом, что переопределенная реализация вызывается при его внутреннем вызове?