ダイナミックエージェント(ベース動的プロキシクラス)

  1. 特徴:負荷で使用されるように作成を使用バイトコード、

  2. 役割:メソッドを強化するためには、に基づいてソースコードを変更しません

  3. カテゴリー:

    1. ダイナミックエージェントインタフェース

    2. 動的プロキシクラスに基づいて、

  4. 動的プロキシクラスに基づいて:

    1. クラスは、関係:強化します

    2. 寄与者:サードパーティ製のライブラリCGLIB

    3. プロキシオブジェクトを作成する方法:クラスを強化createメソッドを使用します

    4. プロキシオブジェクト要求を作成します。エージェントクラスをすることは、最終的なクラスにはできません

    5. メソッドのパラメータを作成します。

      1. クラス:バイトコード

        これは、バイトコード内のプロキシオブジェクトはプロキシオブジェクトのクラスローダを書かれていたがロードされます。(エージェントのクラスローダを書くために来る人)

      2. コールバック:強化さを提供するためのコード

        それは我々がプロキシを書く方法です。私たちは、一般的に、よりこのインタフェースを実装するクラスは、通常は匿名内部クラスですが、必須ではありません。クラス実装者の書き込みと、このインターフェースこと。MethodInterceptorの:私たちは、一般的に、このインタフェースのサブインタフェースの実装クラスを書きます

      3. パッケージcom.xuefei.cglibProxy; 
        
        // メーカー
        パブリック クラスプロデューサー{
             公共  saleProduct(フロートマネー){ 
                System.out.printlnは(「お金、商品あなたに」+ マネー); 
            } 
        
            パブリック 無効 afterProduct(フロートマネー) { 
                System.out.printlnは( + "あなたはお金の売却を取得" お金を); 
            } 
        }
        パッケージcom.xuefei.cglibProxyを。
        
        輸入com.xuefei.proxy.IProducer;
        輸入net.sf.cglib.proxy.Enhancer;
        輸入net.sf.cglib.proxy.MethodInterceptor;
        輸入net.sf.cglib.proxy.MethodProxy;
        輸入java.lang.reflect.InvocationHandler;
        輸入java.lang.reflect.Methodオブジェクト;
        輸入java.lang.reflect.Proxyの; 
        
        パブリック クラスクライアント{
             公共 静的 ボイドメイン(最終文字列[]引数){
                 最終プロデューサープロデューサー= 新たなプロデューサー()。
        
                プロデューサーproducer1=(プロデューサー)Enhancer.create(producer.getClass()、新しい新しいMethodInterceptorの(){
                     / ** 
                     *任意の組み込まれた方法は、オブジェクトのメソッドを介してプロキシされている実行
                     * @param プロキシ
                     * @param メソッド
                     * @paramの引数
                     * @param methodProxy 
                     * @return 
                     *は@throws のThrowable
                      * / 
                    パブリックオブジェクトインターセプト(オブジェクトプロキシ、メソッド、メソッド、オブジェクト[]引数、methodProxy methodProxy)がスローされたThrowable {
                         //が強化コードを提供します
                        returnValue =オブジェクトNULL ;
                         // 方法が行わ取得パラメータ 
                        フロートマネー=(FLOAT)引数[0 ];
                         // 現在の方法が販売されていないか否かを判断する
                        IF( "saleProduct" .equals(method.getName())){ 
                            のreturnValue =メソッド.invoke(プロデューサー、マネー* 0.8 F ); 
                        } 
                        を返すのreturnValueを; 
                    } 
                }); 
                producer1.saleProduct(1000F); 
            } 
        }

         

おすすめ

転載: www.cnblogs.com/lililixuefei/p/11906204.html