目次
0. エージェント モード
1.静的プロキシ
ホームページ Java &#&チュートリアル Javaにおける動的プロキシと静的プロキシの解析例

Javaにおける動的プロキシと静的プロキシの解析例

May 05, 2023 pm 09:37 PM
java

    0. エージェント モード

    なぜエージェント モードを学ぶ必要があるのでしょうか?これは SpringAOP の最下層です [SpringAOP と SpringMVC]

    プロキシ モードの分類:

    • 静的プロキシ

    • 動的プロキシ

    1.静的プロキシ

    静的プロキシでは、ターゲット オブジェクトの各メソッドの拡張は手動で行われます (コードの詳細は後で説明します_)、非常に柔軟性が低く (たとえば、新しいメソッドをインターフェイスに追加すると、ターゲット オブジェクトとプロキシ オブジェクトを変更する必要があります)、面倒です (_それぞれに別個のプロキシ クラス を記述する必要があります)ターゲットクラス)。実際のアプリケーション シナリオは非常に少なく、日常の開発で静的プロキシが使用されるシナリオはほとんどありません。

    #ロール分析:

      #抽象ロール: 一般に、問題を解決するにはインターフェイスまたは抽象クラスが使用されます
    • # #実際の役割: 演じられた役割
    • エージェントの役割: 実際の役割として行動し、実際の役割を果たした後、通常はいくつかの補助的な業務を行います
    • 顧客: プロキシ オブジェクトにアクセスする人!
    • コードステップ:

    1. インターフェイス

    public interface Rent {
        public void rent();
    }
    ログイン後にコピー
    ログイン後にコピー

    2. 実際の文字

    //房东
    public class Host implements Rent {
        public void rent() {
            System.out.println("房东要租房子");
        }
    }
    ログイン後にコピー

    3.エージェント ロール

    public class Proxy implements Rent{
        private Host host;
        public Proxy() {
        }
        public Proxy(Host host) {
            this.host = host;
        }
        public void rent(){
            seeHouse();
            host.rent();
            fare();
        }
        //看房
        public void seeHouse(){
            System.out.println("中介带你看房");
        }
        //收中介费
        public void fare(){
            System.out.println("中介收费");
        }
    }
    ログイン後にコピー

    4. エージェント ロールへのクライアント アクセス

    public class Client {
        public static void main(String[] args) {
            Host host = new Host();
            //代理,代理角色一般会有附属操作!
            Proxy proxy = new Proxy(host);
            proxy.rent();
        }
    }
    ログイン後にコピー

    エージェント モードの利点:

    本当の役割 操作はより純粋です!一部の公的な業務に注意を払う必要はありません。
    • #一般の人々はエージェントの役割に任せられます。ビジネスの分業化を実現!
    • 公共サービスが拡大するときは一元管理が便利!
    • 欠点:

    実際のロールはプロキシ ロールを生成します。JVM の観点から見ると、静的プロキシはインターフェイス、実装クラス、およびプロキシ クラスが実際のクラス ファイルになりました。

    2. 基盤となるプロキシ モデルである

    AOP についての理解を深めます

    3. 動的プロキシJavaにおける動的プロキシと静的プロキシの解析例

    動的プロキシの役割は静的プロキシの役割と同じです
    • 動的プロキシのプロキシ クラスは動的に生成され、直接作成されるものではありません。
    • 動的エージェントは、インターフェイス ベースの動的エージェントとクラス ベースの動的エージェントの 2 つのカテゴリに分類されます。
    • インターフェイス ベース— —JDK 動的プロキシ
      • クラスに基づく: cglib 動的プロキシ
      • Java バイトコード実装: javasist
      • 次の 2 つのクラスを理解する必要があります: Proxy: プロキシ クラス、InvocationHandler: 呼び出しハンドラー

    JVM の観点から見ると、動的プロキシは実行時にクラスのバイトコードを動的に生成し、JVM にロードします。 。

    //Proxy是生成动态代理类,提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。
    //InvocationHandler-- invoke 调用处理程序并返回接口, 是由代理实例的调用处理程序实现的接口 。
    ログイン後にコピー
    動的プロキシの利点:

    現実のキャラクターの操作をより純粋にすることができます。何らかの公的業務に対処する必要はありません
    • 一般向けの業務はエージェントの役割に任せられます。実装
    • public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){
      }
      ログイン後にコピー

    • 1.

    loader : プロキシ オブジェクトをロードするために使用されるクラス ローダー。 2.

    インターフェース : プロキシ クラスによって実装されるいくつかのインターフェース; 3.

    h : InvocationHandler インターフェイスを実装するオブジェクト; 動的プロキシを実装するには、処理ロジックをカスタマイズするために InvocationHandler

    も実装する必要があります。動的プロキシ オブジェクトがメソッドを呼び出すと、このメソッドへの呼び出しは、

    InvocationHandler インターフェイスを実装するクラスの invoke メソッドに転送されます。

    public interface InvocationHandler {
        Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
    }
    ログイン後にコピー
    1.

    proxy: 動的に生成されたプロキシ クラス

    2.

    method: プロキシ クラス オブジェクトによって呼び出されるメソッドに対応します

    3.

    args: 現在のメソッドのパラメータmethod

    動的プロキシの例

    1. インターフェイスを定義します

    public interface Rent {
        public void rent();
    }
    ログイン後にコピー
    ログイン後にコピー

    2. 実装しますレンタル インターフェイス

    public class Host implements Rent {
        @Override
        public void rent() {
            System.out.println("房东要租房");
        }
    }
    ログイン後にコピー

    3. JDK 動的プロキシ クラスを定義します

    public class DebugInvocationHandler implements InvocationHandler {
        /**
         * 代理类中的真实对象
         */
        private final Object target;
        public DebugInvocationHandler(Object target){
            this.target = target;
        }
        /**
         * 当你使用代理对象调用方法的时候实际会调用到这个方法
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //调用方法前
            System.out.println("before method" + method.getName());
            Object res = method.invoke(target, args);
            //调用方法后
            System.out.println("after method" + method.getName());
            return res;
        }
    }
    ログイン後にコピー

    invoke()

    メソッド: 動的プロキシ オブジェクトがネイティブ メソッドを呼び出すと、実際に呼び出されます。取得したのは

    invoke() メソッドで、その後 invoke() メソッドが代わりにプロキシ オブジェクトのネイティブ メソッドを呼び出します。 4. プロキシ オブジェクトのファクトリ クラスを取得する

    public class JdkProxyFactory {
        public static Object getProxy(Object target){
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    new DebugInvocationHandler(target)
            );
        }
    }
    ログイン後にコピー

    getProxy()

    : 主に

    Proxy.newProxyInstance を通じて特定のクラスのファクトリ クラスを取得します。 () メソッド プロキシ オブジェクト5。実際の使用法

    public static void main(String[] args) {
            //Rent rent = new Host();
            //Rent rentProxy= (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(),new DebugInvocationHandler(rent));
            Rent rentProxy = (Rent)JdkProxyFactory.getProxy(new Host());
            rentProxy.rent();
        }
    ログイン後にコピー

    メソッドレント前の上記エージェント実行の出力

    ##家主は家を借りたいと考えています

    メソッドレントの後に

    以上がJavaにおける動的プロキシと静的プロキシの解析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

    Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

    カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

    カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

    Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

    Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

    See all articles