У меня проблемы с реализацией Proxy для класса, который должен печатать трассировку стека для каждого вызова функции класса, потому что функции вложены одна в другую.
Проблема очень похожа, если не такая, как у другого пользователя, ответы помогли мне понять, как к ней подойти, но все же мне не удается ее решить ( Динамический прокси: какобрабатывать вложенные вызовы методов ).
У меня есть класс:
public class NestedCalls implements INestedCalls{
private int i = 0;
public int a() {
return b(i++);
}
public int b(int a) {
return (i<42)?c(b(a())):1;
}
public int c(int a) {
return --a;
}
}
и его интерфейс:
public interface INestedCalls {
public int a() ;
public int b(int a) ;
public int c(int a) ;
}
Обработчик, который я реализовал, выглядит следующим образом:
public class NestHandler implements InvocationHandler {
Object base;
public NestHandler(Object base) {
this.base=base;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(base, args);
printNest();
return result;
}
private void printNest() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
StackTraceElement[] stack = new Throwable().getStackTrace();
System.out.println("num of elem " + stack.length);
for(int i=0; i<stack.length; i++) {
System.out.println("elem "+i+": "+stack[i]);
}
}
}
Что я хочу сделать, это инициализировать объект и прокси из моего основного и после вызова метода, я ожидаю, что буду печатать трассировку стека каждый раз, когда вызывается метод класса.
INestedCalls nestedcalls = new ENestedCalls();
INestedCalls nestproxy = (INestedCalls) Proxy.newProxyInstance(nestedcalls.getClass().getClassLoader(), nestedcalls.getClass().getInterfaces(), new NestHandler(nestedcalls));
nestproxy.a();
Насколько я понимаю, это не работает, потому что прокси-сервер обрабатывает все с помощью внутриобъектного объекта, и поэтому вложенные методы не вызываются через интерфейс прокси.
Как получитьэффект, который я хочу, не касаясь кода класса?