0

我对这种情况有点困惑:

我有一个实现标题中提到的 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();
        
    }

现在的问题是“调用”会引发如下错误:

...

在 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 的调用方法:

处理代理实例上的方法调用并返回结果。当在与其关联的代理实例上调用方法时,将在调用处理程序上调用此方法。

参数:proxy - 调用该方法的代理实例

...所以我不明白为什么会出错...

4

1 回答 1

4

System.out.println(proxy);将隐式调用toString()代理,即调用代理方法。

于 2011-08-05T08:23:30.897 回答