我在为类实现代理时遇到问题,该类必须为类的函数的每次调用打印堆栈跟踪,因为这些函数彼此嵌套。
问题非常相似,即使彼此之间都不相同,答案也帮助我理解了解决方法,但仍然无法解决(Dynamic Proxy: how to handle nested method calls)。
我正在上课:
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]);
}
}
}
我的目的是从主对象初始化对象和代理,并在调用方法后希望每次调用该类的方法时都打印stacktrace。
INestedCalls nestedcalls = new ENestedCalls();
INestedCalls nestproxy = (INestedCalls) Proxy.newProxyInstance(nestedcalls.getClass().getClassLoader(), nestedcalls.getClass().getInterfaces(), new NestHandler(nestedcalls));
nestproxy.a();
据我所知,这是行不通的,因为代理使用内部对象处理所有事务,因此嵌套方法不会通过代理接口调用。
如何在不接触课程代码的情况下获得想要的效果?