動的プロキシプロキシモード---

まず、ダイナミック剤の導入

  • 動的および静的プロキシエージェントの役割が同じで、プロキシクラスの静的プロキシモードは、我々の前に書き込まれ、動的プロキシクラスは、実際には、静的および動的プロキシエージェントの本質は、のように、最終的なプログラムを実行する必要があり、動的に生成されます関連するビジネス・ロジックを強化し、完成に至るまで、プロキシオブジェクトのインスタンスを生成しますが、静的なエージェントは、ハードコードされた指定し、動的にこの実装動的プロキシランタイム・サポートを生成する必要があります。明らかに、符号化時に動的に生成の利点は、プロキシ・ロジックと、互いに独立したビジネスロジックは、何のカップリングが存在しない、邪魔にない、それぞれに影響を与えません。

第二に、動的プロキシは、2つのクラスに関連付けられています

  •  インタフェースのInvocationHandler:このインタフェースは、メソッドオブジェクトを定義:(オブジェクトOBJ、メソッドのメソッド、オブジェクト[]引数)を呼び出します。実際の使用では、最初のパラメータOBJ一般には、プロキシクラスを指し、この方法は、プロキシ方式は、このメソッドの引数のパラメータ配列です。動的プロキシクラスに実装され、この抽象メソッド
  • プロキシは:このクラスは動的プロキシクラス、主に以下の内容を含むProxySubjectを、実施の形態と同様の効果である
    プロキシ(のInvocationHandler hの)プロテクト:コンストラクタ、割り当ての推定値Hの内部に。
    静的クラスgetProxyClass(クラスローダローダ、クラス []インターフェイス): プロキシクラスを求めるクラスローダはローダ、インタフェースのすべてのインターフェイスのアレイである、請求有し、実際のクラス

 

第三に、ダイナミックな薬剤のためのコード

1、抽象的役割

1  // 役割抽象
2  パブリック インターフェースユーザー{
 3。 
4。     公共 ボイド追加();
 5  
。6 }

 

2、本当の役割

1  // 真ロール
2つの パブリック クラスのUserImpl 実装ユーザー{
 3  
。4      公共 ボイドは(){加える
 。5          のSystem.out.println( "これは、Addメソッドです" );
 6      }
 。7  
。8 }

 

図3に示すように、動的に生成されたプロキシ・クラス・インターフェース・オブジェクト

1つの インポートjava.lang.reflect.InvocationHandler。
2  インポートjava.lang.reflect.Methodオブジェクト。
3  インポートjava.lang.reflect.Proxyの。
4  
5  パブリック クラス InvocationHandlerProxyは   実装のInvocationHandler {
 6  
7      プライベートユーザユーザと、
8  
9      公共 ボイドSETUSER(ユーザユーザ){
 10          この .user = ユーザー。
11      }
 12  
13      // 动态生成代理类
14      公的オブジェクトgetProxy(){
 15          リターンたとえば、Proxy.newProxyInstance(この.getClass()のgetClassLoader(),.
 16                  user.getClass()でgetInterfaces(),. );
 17      }
 18である 
19。     // プロキシ:プロキシクラス
 20は     // 呼び出しハンドラプロキシクラス:方法オブジェクトのメソッド
21は、     パブリックオブジェクト呼び出しは、([]引数オブジェクト、方法、プロキシ、メソッドオブジェクト)スローのThrowable {
 22である         show1を();
 23で          呼び出し=オブジェクト、Method.invoke(ユーザー、引数)
 24          Show2を();
 25          戻り、呼び出し
 ている26      }
 27  
28      公衆 ボイドshow1(){
 29          のSystem.out.println( "表示方法1" )。
30      }
 31  
32      公共 ボイドshow2(){
 33          のSystem.out.println( "表示方法2" )。
34      }
 35 }

[注]のInvocationHandlerガイドパッケージ

 

 4、試験

 1 public class Test {
 2     public static void main(String[] args) {
 3 
 4         UserImpl userImpl = new UserImpl();
 5 
 6         InvocationHandlerProxy ihp = new InvocationHandlerProxy();
 7         ihp.setUser(userImpl);
 8 
 9         User proxy = (User) ihp.getProxy();
10 
11         proxy.add();
12     }
13 }

 

5,运行结果

 

 

四,总结

 动态代理的好处

  • 可以使真实角色更加纯粹,不用去关注一些公共的事情
  • 公共的业务由代理来完成,实现业务的分工
  • 公共业务的要扩展的话,可以更加集中和方便
  • 一个动态代理,一般代理一类的业务,一个动态代理可以代理多个类,代理接口

 

おすすめ

転載: www.cnblogs.com/tqsh/p/11304211.html