Что представляет собой «прокси» объект из списка параметров метода invoke java.lang.reflect.InvocationHandler? - PullRequest
0 голосов
/ 05 августа 2011

Я немного смущен этим сценарием:

У меня есть класс, который реализует интерфейс InvocationHandler, упомянутый в заголовке, класс, который выглядит как:


class SimpleProxy implements InvocationHandler{

    private Object proxied;

    public SimpleProxy(Object proxied) {
        this.proxied = proxied;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println(proxy);
        return method.invoke(proxied, args);

    }

}

и позволяет сказатьмой «основной» метод у меня есть:


public static void main(String[] args) {

        consumer(new RealObject());

        MyInterface proxy = (MyInterface)Proxy.newProxyInstance(MainClass.class.getClassLoader(), new Class[]{MyInterface.class}, new SimpleProxy(new MyInterfaceImpl()));

        proxy.methodFromMyInterface();

    }

Теперь проблема в том, что «invoke» выдает ошибку вроде:

...

вrtti.SimpleProxy.invoke (MainClass.java:81)

в rtti. $ Proxy0.toString (неизвестный источник)

в java.lang.String.valueOf (String.java:2826)

в java.io.PrintStream.println (PrintStream.java:771)

в rtti.SimpleProxy.invoke (MainClass.java:81)

в rtti. $Proxy0.toString (неизвестный источник)

в java.lang.String.valueOf (String.java:2826)

в java.io.PrintStream.println (PrintStream.java:771)

...

из-за этой строки:

System.out.println (прокси);

ЕслиЯ комментирую эту строку, все работает отлично.

Может кто-нибудь объяснить мне, в чем проблема?

NB В документации Java говорится о методе invoke от InvocationHandler:

Обрабатывает вызов метода на экземпляре проксии возвращает результат.Этот метод будет вызываться в обработчике вызова, когда метод вызывается для экземпляра прокси, с которым он связан.

Параметры: proxy - экземпляр прокси, для которого был вызван метод

... поэтому я не могу понять, почему это идет не так ...

1 Ответ

4 голосов
/ 05 августа 2011

System.out.println(proxy); неявно вызовет toString() на прокси, то есть вызовет прокси-метод.

...