(A)デザインパターンプロキシモード

 

 

 

 

I.はじめに

   Javaの動的なプロキシによってAOP傍受機能を実現しています。端的に言えば、上のターゲットクラスに基づいてカットロジックを高める強化ターゲットクラスを生成する(セクションロジックまたはターゲット機能を実行する、またはターゲットクラスの関数実行後、または対象のクラス関数上で実行されたときに例外をスローする前にすることである。異なりますインターセプタに対応する切削時間の異なるタイプ、例えばBeforeAdviseInterceptor、AfterAdviseInterceptor ThrowsAdviseInterceptorなど)。その後、動的プロキシは、それにターゲットクラスのアプローチに織り込まロジック部(アドバイス)を達成する方法ですか?ここでは詳細に説明し、で使用される2つの動的プロキシAOPを実現します。ステージ機能傍受実装するために2つの動的プロキシに使用AOPソースコード:JDKダイナミックプロキシとCGLIB動的プロキシ。どちらの方法でも、利点と欠点が存在します。JDK動的プロキシ機構を実現するJavaの内部で反射され、CGLIB基礎となる動的プロキシは、ASMの手段によって実現されます。一般的に、より効率的な生成クラス、および相関処理の反映処理は、より効率的なASM生成されたクラスの後に行われる(ASMは、生成されたクラスでキャッシュすることができ、クラスは、ASM生成プロセスの非効率性を解決しました) 。また、注意しなければなりません:前提のJDKのダイナミックプロキシは、それがターゲットクラス統一されたインタフェースに基づいていなければなりません。そうでない場合は上記の前提は、JDKの動的プロキシを適用することはできません。動的プロキシは、いくつかの制限、より広く、よりダイナミックなプロキシを実装CGLIBサードパーティ製のライブラリ効率の利点を持っているをjdk、見ることができます。

 

 

第二に、ケース

チケットを購入するユーザーのフライングピッグは、例えば、プラットフォームがプロキシフライングピッグ、チケットに基づいてユーザのためのフライングピッグプラットフォームであることは明らかですが、また、このようなチェックIDカードのチケットなどの追加機能を追加します購入後、ユーザーに資格情報を提供する必要があります。

 

アクセスID番号、名前、バランスを含む1、定義されたインタフェースの購買行動、

パブリックインターフェースTicketBuy {

    / **
     *チケット
     * /
    無効買い();

    / **
     * ID番号を取得します。
     * @return
     * /
    ストリングのgetId();

    / **
     *名前を取得します。
     * @return
     * /
    文字列のgetName()。

    / **
     *バランスを取得
     * @return
     * /
    ダブルgetMoney();
}

  

図2に示すように、ユーザのクラス定義、すなわち、プロキシクラス

パブリック クラスパーソン実装TicketBuy {

    プライベート文字列ID;

    プライベート文字列名;

    プライベートダブルお金。

    @オーバーライド
    パブリック文字列のgetId(){
         戻りID。
    }

    公共 ボイドSETID(文字列ID){
         この .ID = ID。
    }

    @オーバーライド
    パブリック文字列のgetName(){
         戻り名。
    }

    公共 ボイドのsetName(文字列名){
         この .nameの= 名前。
    }

    @オーバーライド
    公共ダブルgetMoney(){
         リターンのお金。
    }

    公共 のボイドsetMoney(ダブル金){
         この .money = お金。
    }

    @オーバーライド
    公共 のボイド買い(){
         この .money - 
        System.out.println(「ユーザー:」+ この .getName()+「はチケットを買うために、バランスは左:」+ マネー)。
    }
}

3、フライングピッグプラットフォームカテゴリの定義、すなわち、プロキシクラス

パブリック クラス FlyPig 実装のInvocationHandler {

    民間人の対象;

    / **
     *主なデータを取得します
     * @paramのターゲット
     * @return 
     * / 
    パブリックオブジェクトのgetInstance(人の対象){
         この .TARGET = ターゲット。
        クラスclazz = target.getClass()。
        リターンたとえば、Proxy.newProxyInstance(clazz.getClassLoader()、clazz.getInterfaces()、この);
    }


    @オーバーライド
    パブリックオブジェクトを呼び出し(オブジェクトプロキシ、メソッドのメソッド、オブジェクト[]引数)がスローのThrowableを{

        System.out.println( "フライングピッグプラットフォームチェックID +名:" + この .target.getId()+ "+" + この.target.getName());

        この.target.buy();

        System.out.println( "印刷バウチャー!" );

        リターン ヌル
    }
}

4、試験の種類:

パブリック クラスのテスト{

    パブリック 静的 ボイドメイン(文字列[]引数){
        人PERSON1 = 新しい人();
        person1.setName(「ジョー・スミス」)。
        person1.setId( "35052511111111111" );
        person1.setMoney( 100.00 )。
        TicketBuyプロキシ =(TicketBuy)(新規。FlyPig()のgetInstance(PERSON1))。
        proxy.buy();
    }

}

結果

 

5、決意

 

おすすめ

転載: www.cnblogs.com/shyroke/p/11994852.html