我对这个场景有点困惑:
我有一个类实现了在标题中提到的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);
}
}
在my "main"方法:
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();
}
现在的问题是"抛出如下错误:
…
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(代理);
如果我注释这行,一切都可以正常工作。
谁能给我解释一下是什么问题?注意:在Java文档中,它说从InvocationHandler调用方法:
处理代理实例上的方法调用并返回结果。当方法在与其关联的代理实例上被调用时,将在调用处理程序上调用此方法。
参数:代理——在
上调用方法的代理实例
…所以我不明白为什么会出错。
System.out.println(proxy);
将隐式调用代理上的toString()
,即调用被代理的方法。