2016-04-12 6 views
0

私はチェックしましたthis stackoverflow post。しかし、私はまだ理解していませんでした。JDKプロキシのプロキシインスタンスが呼び出しハンドラに渡される方法は?

JDKプロキシでは、Proxy.newInstance(arg1、arg2、arg3)は新しいプロキシインスタンスを作成します。このプロキシインスタンスでメソッドを呼び出すと、関連する呼び出しハンドラが呼び出されます。呼び出しハンドラの呼び出しメソッドは、呼び出しを実際のメソッドに委譲します。

invokeメソッドには3つの引数があります。最初のものは、呼び出しが行われたプロキシインスタンスとして言及されています。私の疑問は、プロキシインスタンスが呼び出しハンドラの呼び出しメソッドにどのように渡されるかです。

疑いをより明確に理解するには、下のコードをご覧ください。

インタフェース

package proxyclasses; 

public interface Animal { 
    public abstract void eat(String food); 
} 

具象クラス

パッケージproxyclasses。

public class Cow implements Animal { 

    public void eat(String food) { 
     System.out.println("Cow eats "+food); 
    } 

} 

プロキシクラス

package proxy; 

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 

public class MyInvocationHandler implements InvocationHandler { 

    private Object target; 

    public MyInvocationHandler(Object target) { 
     this.target = target; 
    } 
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable { 
     System.out.println("Proxy "+proxy.getClass().getName()); 
     Object result = method.invoke(target, args); 
     return result; 
    } 

} 

メインクラス

import java.lang.reflect.Proxy; 

import proxy.MyInvocationHandler; 
import proxyclasses.Animal; 
import proxyclasses.Cow; 


public class ProxyExample { 
    public static void main(String args[]){ 
     Cow cow = new Cow(); 
     Animal proxInstance = (Animal)Proxy.newProxyInstance(Cow.class.getClassLoader(),Cow.class.getInterfaces(),new MyInvocationHandler(cow)); 
     proxInstance.eat("Grass"); 
    } 
} 

ここに私の疑問は、メインクラスの 'proxInstance' がmyInvocationHandlersに渡される方法であるメソッドを呼び出しますか?

+0

プロキシを理解して以来、参照がメソッド呼び出しにどのように渡されるかを理解しているので、私はそれが何を求めているのか分かりません。 –

答えて

0

私の疑問は、メインクラスの 'proxInstance'がmyInvocationHandlersメソッドを呼び出す方法です。

あなた自身の質問に答えているようです。

私たちは、このプロキシインスタンス上のメソッドを呼び出すとき、それはあなたが

thisラッププロキシオブジェクトである
Method method = ... 
Object[] args = ... 
handler.invoke(this, method, args); 

のようなものを持っている

それに関連する呼び出しハンドラを呼び出しますハンドラ、あなたが呼び出したプロキシです。

+0

プロキシインスタンスによるメソッド呼び出しは、それ自身を呼び出しハンドラにどのように渡しますか? –

関連する問題