Java代理调用嵌套调用

时间:2018-11-22 18:41:38

标签: java nested dynamic-proxy

我在为类实现代理时遇到问题,该类必须为类的函数的每次调用打印堆栈跟踪,因为这些函数彼此嵌套。

问题非常相似,即使彼此之间都不相同,答案也帮助我理解了解决方法,但仍然无法解决(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();

据我所知,这是行不通的,因为代理使用内部对象处理所有事务,因此嵌套方法不会通过代理接口调用。

如何在不接触课程代码的情况下获得想要的效果?

0 个答案:

没有答案