動的プロキシ反射の応用

動的プロキシの使用は、反射が動的言語への鍵です

TestDynamicProxy

パッケージcom.aff.dynamic; 

インポートjava.lang.reflect.InvocationHandler;
 インポートjava.lang.reflect.Methodオブジェクト、
 インポートjava.lang.reflect.Proxyの; 

/ * 
 動的プロキシクライアントは、プロキシクラスを介して他のオブジェクトを呼び出すための方法をいいます、
 必要に応じて実行時に動的にプロキシオブジェクトのターゲットクラスを作成しています。
 ダイナミックエージェントの使用:
                            デバッグ
                            リモートメソッド呼び出し
原則プロキシデザインパターンを:
                   オブジェクトをラップするためにプロキシを使用して、プロキシオブジェクトと元のオブジェクトを置き換えます。
                   元のオブジェクトのプロキシのプロキシオブジェクトを通過する任意の呼び出しがいるかどうか、いつ決めます。この方法は、元のオブジェクトへの呼び出し。
 * / 


// キー動的言語反射動的プロキシ、
インターフェース件名{
     ボイドアクション(); 
} 

// プロキシクラス
クラス RealSubject実装の件名{
     公共の 無効(){アクション
        のSystem.out.printlnは(「私がやることを忘れないでください、プロキシクラスだった」); 
    } 
} 

// プロキシクラスの
クラス MyInvocationHandler 実装のInvocationHandler { 
    オブジェクトobj; // 実装するプロキシインタフェースオブジェクトクラス宣言
     //                  オブジェクトに①プロキシクラスがインスタンス化される
     //                  ②戻るプロキシオブジェクトクラス

    パブリックオブジェクトブラインド(オブジェクトobj){
         この .OBJ = ; OBJ
         // プロキシクラス:プロキシ
         // たとえば、Proxy.newProxyInstance :薬の新しいクラスの例だけでなく、対応するインタフェースを達成するためには、プロキシクラス抽象メソッドに実装されて
         //。obj.getClass()のgetClassLoader():OBJとクラスローダが同じであり、同じクラスのクラスローダのOBJプロキシオブジェクトである
         // obj.getClass()でgetInterfaces();プロキシクラスが実装されています。どのようなプロキシクラス(プロキシ)、インターフェースすぎ
         // この:MyInvocationHandlerはクラスオブジェクトのInvocationHandlerインタフェース、達成するために
         // このステッププロキシクラスの実質リターン目標
        リターンたとえば、Proxy.newProxyInstance(obj.getClass()のgetClassLoaderを(。 )、obj.getClass()でgetInterfaces(),. ); 
    } 

    // オブジェクトのプロキシクラスは、アクションメソッドを呼び出すたびに上書きするには、としてinvokeメソッドの呼び出しに変換する
    @Override
     パブリックオブジェクト呼び出し(プロキシオブジェクト、メソッド、メソッド、オブジェクト[]引数)が   スローされたThrowable {
         // プロキシクラスに対応returnVal戻り値は、抽象メソッド(アクション)の戻り値であります
        Method.invoke returnVal =オブジェクト(OBJ、引数); // objはプロキシクラスである
        リターンreturnVal; 
    } 
} 

パブリック クラスTestDynamicProxy {
     公共 静的 ボイドメイン(文字列[]引数){
         // 1クラスのプロキシオブジェクト 
        RealSubject実= 新しい新しいRealSubject();
         // 2.実現のInvocationHandlerインタフェースクラスオブジェクト作成 
        MyInvocationHandlerハンドラ= 新しい新しいMyInvocationHandler();
         // ブラインドを呼び出し3()メソッドの戻り等しく動的実クラスが実装するインターフェイスをここでの実装代理オブジェクトの 
         オブジェクトOBJ = handler.blind(実); // 実タイプによって受信主題、オブジェクトであります
         サブ=件名(サブジェクト)は、obj; // 強いターンにそれを乗り越えた後、アクションを呼び出し、サブプロキシクラスが今回の目的である、
         
         sub.action(); // 呼び出しのインタフェースクラス(MyInvocationHandler)(の移動のInvocationHandlerの実装)メソッド呼び出し
    } 
}

 

おすすめ

転載: www.cnblogs.com/afangfang/p/12625808.html