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(プロキシ);

この行にコメントすると、everithingは正常に機能します。

誰かが私に何が問題なのか説明できますか?

注意:Javaドキュメントでは、InvocationHandlerからのinvokeメソッドについて次のように述べています。

プロキシインスタンスでメソッド呼び出しを処理し、結果を返します。このメソッドは、関連付けられているプロキシインスタンスでメソッドが呼び出されると、呼び出しハンドラーで呼び出されます。

パラメータ:proxy-メソッドが呼び出されたプロキシインスタンス

...だから私はそれがうまくいかない理由を理解できません...

4

1 に答える 1

4

System.out.println(proxy);プロキシを暗黙的に呼び出しますtoString()。つまり、プロキシされたメソッドを呼び出します。

于 2011-08-05T08:23:30.897 に答える