まず、ダイナミック剤の導入
- 動的および静的プロキシエージェントの役割が同じで、プロキシクラスの静的プロキシモードは、我々の前に書き込まれ、動的プロキシクラスは、実際には、静的および動的プロキシエージェントの本質は、のように、最終的なプログラムを実行する必要があり、動的に生成されます関連するビジネス・ロジックを強化し、完成に至るまで、プロキシオブジェクトのインスタンスを生成しますが、静的なエージェントは、ハードコードされた指定し、動的にこの実装動的プロキシランタイム・サポートを生成する必要があります。明らかに、符号化時に動的に生成の利点は、プロキシ・ロジックと、互いに独立したビジネスロジックは、何のカップリングが存在しない、邪魔にない、それぞれに影響を与えません。
第二に、動的プロキシは、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,运行结果
四,总结
动态代理的好处
- 可以使真实角色更加纯粹,不用去关注一些公共的事情
- 公共的业务由代理来完成,实现业务的分工
- 公共业务的要扩展的话,可以更加集中和方便
- 一个动态代理,一般代理一类的业务,一个动态代理可以代理多个类,代理接口