ホームページ >Java >&#&チュートリアル >Java ダイナミック プロキシとは何か、およびその実装方法

Java ダイナミック プロキシとは何か、およびその実装方法

WBOY
WBOY転載
2023-05-02 16:55:151138ブラウズ

1. プロキシモード

あるクラス(特定の実装クラス)のメソッドを呼び出す必要がある場合、そのクラスのオブジェクトを直接作成するのではなく、そのクラスのプロキシクラスオブジェクトを取得します。そして、プロキシ オブジェクトを通じてそれを使用し、特定の実装クラスの関数を呼び出します。具象実装クラスとプロキシクラスはどちらも同じインタフェースを実装しており、プロキシクラスは実装クラスのオブジェクトを保持します。これにより、呼び出し側と特定の実装側の間に分離層が作成され、直接の対話が回避されます。

現実にも代理店モデルに似た例はたくさんありますが、例えば家を買うときや借りるときには仲介業者を通さなければなりませんが、この仲介業者が代理店に相当します。

2. 静的プロキシの実装

1) インターフェイスの定義:

public interface IHouse {
    void sallHouse();
    int sallHouse2();
}

2) 特定の実装クラス:

public class Andy implements IHouse {
    @Override
    public void sallHouse() {
        System.out.println("andy sall house..");
    }
    @Override
    public int sallHouse2() {
        return 100;
    }
}

3) プロキシ クラス:

public class HouseProxy implements IHouse {
    Andy andy;
    public HouseProxy(Andy andy) {
        this.andy = andy;
    }
    @Override
    public void sallHouse() {
        andy.sallHouse();
    }
    @Override
    public int sallHouse2() {
        return andy.sallHouse2();
    }
}

4) クライアント呼び出し:

        //1.创建被代理对象
        Andy andy = new Andy();
        //2.创建代理对象,代理对象持有被代理对象的引用
        HouseProxy proxy = new HouseProxy(andy);
        //3.客户端通过代理对象调用。
        proxy.sallHouse();

3. 動的プロキシ実装

  //1.被代理对象
        final Andy andy = new Andy();
        //2.创建动态代理,Java在运行时动态生成的。
        ClassLoader classLoader = andy.getClass().getClassLoader();
        Class[] interfaces = andy.getClass().getInterfaces();
        IHouse iHouse = (IHouse) Proxy.newProxyInstance(classLoader, interfaces, new             InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                //通过反射调用被代理对象的方法
                return method.invoke(andy, objects);
            }
        });
        //3.客户端通过代理对象调用被代理方法。
        iHouse.sallHouse();

動的プロキシ分析:

1) IHouse iHouse = (IHouse) プロキシ.newProxyInstance();動的プロキシ オブジェクトを作成します。

には 3 つのパラメータがあります:

1.ClassLoader クラス ローダー

2.プロキシ インターフェイスのクラス クラス 、

3.InvocationHandler インターフェイス実装クラス

2) iHouse ダイナミック プロキシを取得した後、インターフェイス メソッド iHouse.sallHouse();

このメソッドが呼び出されたらすぐにインターフェイス メソッドを呼び出します。 , InvocationHandlerクラスのinvokeメソッドが実行されます。

@Override

public Object invoke(Object o, Method Method, Object[] events) throws Throwable {

//リフレクション メソッドを通じてプロキシ オブジェクトを呼び出します

returnメソッド.invoke(andy,objects);

}

invokeメソッドには3つのパラメータがあります:

method、プロキシ クラス 呼び出されるメソッド名 (sallHouse)

objects は、プロキシ クラスがメソッドを呼び出すときに渡されるパラメータです。

Object obj = method.invoke(andy,objects); リフレクション メカニズム、特定のインプリメンタの対応するメソッドを通じて andy オブジェクトを呼び出します。

彼の戻り値は、プロキシ オブジェクトがインターフェイスを呼び出すときに受け取ることができ、それがどのような型であっても、どのような型が返されるかがわかります。これが Retrofit の機能です

以上がJava ダイナミック プロキシとは何か、およびその実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。