Javaダイナミックプロキシの原理と実装方法とは何ですか

王林
リリース: 2023-05-20 17:52:06
転載
1009 人が閲覧しました

エージェントとは次のことを指します: 一部のシナリオでは、被験者は有名人のエージェント、不動産業者を探している住宅購入者など、いくつかのタスクの完了を支援してくれるエージェントを見つけます。

エージェントは主に、オブジェクトの動作に対していくつかの追加の補助操作を実行します。

プロキシ オブジェクトの作成方法:

Java におけるプロキシの代表的なクラスは次のとおりです: Java.lang.reflect.Proxy

プロキシは、オブジェクトを生成するための静的メソッドを提供します。プロキシ オブジェクトは次を返します。

メイン クラス:

public class Test {
    public static void main(String[] args) {
        //1、创建一个类,对象类必须实现接口
        star s=new star("小明");
        //为小明这个明星对象生成一个代理对象(经纪人)
        skill s2=StarAgentProxy.getProxy(s);
        s2.sing();//走代理的
        s2.jump();
        
        //运行结果:
        //代理开始
        //小明开始唱歌
        //代理结束
        //代理开始
        //小明开始跳舞
        //代理结束
    }
}
ログイン後にコピー

スター クラス (オブジェクト クラス):

//明星类
public class star implements skill{
    private String name;
 
    public star(String name) {
        this.name = name;
    }
    //重写方法
    public void jump(){
        System.out.println(name+"开始跳舞");
    }
    public void sing(){
        System.out.println(name+"开始唱歌");
    }
}
ログイン後にコピー

ビヘイビア インターフェイス クラス:

//行为类
public interface skill {
    void jump();//跳舞
    void sing();//唱歌
}
ログイン後にコピー

プロキシ クラス:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
//代理类
public class StarAgentProxy {
    //定义一个方法来返回一个明星对象的代理对象
    public static skill getProxy(star obj){
        //为小明这个对象生成一个代理对象
        /*
          public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces, 对象实现的接口列表
                                          InvocationHandler h)
         */
        return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理开始");
                        //真正的让小明去唱歌、跳舞
                        //method==>正在调用的方法对象, args==>代表这个方法的参数
                        Object rs=method.invoke(obj,args);
                        System.out.println("代理结束");
                        return rs;
                    }
                });
    }
}
ログイン後にコピー

実装手順:

1. インターフェイスが存在する必要があります

2. プロキシ オブジェクトはインターフェイスを実装する必要があります

3. によって提供されるメソッドを使用します。オブジェクトを取得するプロキシクラス プロキシオブジェクト

Javaダイナミックプロキシの原理と実装方法とは何ですか

# プロキシオブジェクトを介してメソッドを呼び出しますが、実行処理はどうなっているのでしょうか?

1. 最初にエージェントに移動します

2. エージェントはメソッドに対して追加の補助作業を行うことができます

3. 実際にトリガーするメソッドの実行を開始しますobject

4. エージェントに戻ります。エージェントは、メソッドの呼び出し元に結果を返す責任があります。

コードを最適化するための主要な手順:

1.インターフェースが必要であり、実装クラスはそのインターフェースを実装する必要があります (エージェントは通常、インターフェースの実装に基づいています)

2. ビジネス オブジェクトである実装クラスのオブジェクトを作成し、ビジネス オブジェクトのプロキシ オブジェクト

#動的プロキシの利点:

1. メソッドのソース コードを変更せずにメソッドの機能を強化し、コードの再利用を向上させることができます。

#2. プログラミング作業が簡素化され、開発効率が向上し、ソフトウェア システムが向上します。 スケーラビリティ

##3. プロキシされたオブジェクトのすべてのメソッドのプロキシとして使用可能

4. 非常に柔軟で、任意のインターフェイス タイプの実装クラス オブジェクトをプロキシとしてサポートすることも、インターフェイス自体を直接プロキシすることもできます。 Proxy

任意のインターフェイス タイプの実装クラス オブジェクトのプロキシ用のフレームワーク (ジェネリックを実行中)

    public static <T> T get(T obj){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                });
    }
ログイン後にコピー

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

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート