2011-08-05 5 views
0

私は、このシナリオで混乱少しだ:java.lang.reflect.InvocationHandlerのinvokeのメソッドパラメータリストからの "proxy"オブジェクトはどのようなものを表しますか?

私はタイトルに言及したの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で

(文字列.java:2826)java.io.PrintStream.printlnで

(PrintStream.java:771)rtti.SimpleProxy.invokeで

(MainClass.java:81)

RTTIでjava.io.PrintStream.println(PrintStream.java:771)

でjava.lang.String.valueOfで。$ Proxy0.toString(不明なソース)

(String.java:2826)

...なぜなら、このラインの

のSystem.out.println(プロキシ)。

私は正常に動作everithingこの行をコメントした場合。

誰でも問題を教えていただけますか?

N.B. JavaドキュメントではInvokeHandlerの呼び出しメソッドについて述べています。

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

パラメータ: プロキシ - プロキシインスタンスメソッドが

に呼び出されたこと...それは間違っている理由私は理解できない...

答えて

4

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

+0

はい。あなたは私を照らした。ありがとうございました! – artaxerxe

関連する問題