Вызов прокси Java для вложенных вызовов - PullRequest
0 голосов
/ 22 ноября 2018

У меня проблемы с реализацией 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();

Насколько я понимаю, это не работает, потому что прокси-сервер обрабатывает все с помощью внутриобъектного объекта, и поэтому вложенные методы не вызываются через интерфейс прокси.

Как получитьэффект, который я хочу, не касаясь кода класса?

...