JDKのダイナミックプロキシはJDKのjava.lang.reflect.Proxyクラスによって達成されます。以下は、特定のケースでの使用JDKのダイナミックプロキシを示しています。 1 。プロジェクト作成 WEBのWebプロジェクトへのMyEclipse WebプロジェクトにspringDemo03の名前を作成するために、春のJARの依存関係とサポートパッケージを -INF / libディレクトリに、クラスパスに投稿しました。 2 。インターフェイスCustomerDaoを作成し 、以下に示すように、このインタフェースパッケージCustomerDaoを作成するためにcom.mengma.daoパッケージをという名前のプロジェクトのsrcディレクトリに作成、編集。 パッケージに違約金com.mengma.dao、 パブリック インターフェイスCustomerDao { 公共 空の追加(); // 追加 公共 のボイドの更新を(); // 変更 公衆 無効に削除を(); // 削除の 公共 のボイドのFind(); //クエリ } 3は。インプリメンテーション・クラスを作成CustomerDAOImpl com.mengma.daoパッケージにインタフェースクラスCustomerDaoImpl CustomerDaoの実装を作成するために、以下に示すように、インタフェースのすべてのメソッドを実装します。 パッケージcom.mengma.dao; パブリック クラス CustomerDAOImpl 実装CustomerDao { @Override 公共 のボイドの追加(){ System.out.printlnは( "...お客様の追加" ); } @Override 公共 のボイドの更新(){ System.out.printlnは( "...クライアントを変更" ); } @Override 公共 のボイド削除(){ System.out.printlnは( "削除客..."); } @Override 公共 無効検索(){ System.out.printlnは( "変更カスタマー..." ); } } 4 クラスMyAspectカット作成します。 com.mengma.jdkというパッケージを作成し、srcディレクトリ内の下図のように編集されたパケットのクラスMyAspectでカットし、作成します。 パッケージcom.mengma.jdk; パブリック クラスMyAspect { 公共 ボイドmyBefore(){ System.out.printlnは( "実行方法の前に" ); } 公共 ボイドmyAfter(){ System.out.printlnは( "メソッドの実装後" )。 } } 上記のコードは、切断面が強化ターゲット・クラス(CustomerDAOImpl)のために、二つの拡張方法において、それぞれmyBefore()メソッドとmyAfter()メソッドが定義されています。
5 。プロキシクラスを作成MyBeanFactory 以下のようにcom.mengma.jdkパッケージでMyBeanFactoryという名前のクラスを作成するために、クラスのjava.lang.reflect.ProxyのJDKの動的プロキシを使用して実装。 パッケージcom.mengma.jdk; インポートjava.lang.reflect.InvocationHandler; インポートjava.lang.reflect.Methodオブジェクト、 インポートjava.lang.reflect.Proxyの; インポートcom.mengma.dao.CustomerDao; インポートcom.mengma.dao。 CustomerDAOImpl; パブリック クラスMyBeanFactory { パブリック 静的CustomerDao getBean(){ //は、特定のクラス準備 最終 CustomerDao customerDao = 新しい新しいCustomerDAOImplを(); // クラスインスタンスカットを作成します 最終 MyAspect myAspect = 新しいMyAspect()。 // 使用代理类、进行增强 リターン(CustomerDao)たとえば、Proxy.newProxyInstance( MyBeanFactory。クラス.getClassLoader()、 新しいクラス[] {CustomerDao。クラス }、新規のInvocationHandler(){ パブリックオブジェクトを呼び出し(オブジェクトプロキシ、メソッドの方法、 オブジェクト[]引数)スローのThrowable { myAspect.myBeforeを(); // 前增强 オブジェクトOBJ = method.invoke(customerDao、引数)。 myAspect.myAfter(); //のように拡張 戻りOBJ; } }); } } 上記のコード、ここでシミュレートgetBean()メソッドの静的な定義は、getBean()メソッドを呼び出すことによってインスタンスを作成、IoCのSpringフレームワークを考え、最初の 14個のコードの行がcustomerDaoインスタンスを作成します。 最初のクラスのインスタンスを作成するためのコードの16行は、対応する方法の態様のクラスのコールを切断し、18〜26 行拡張コードのインスタンスcustomerDao方法、第二プロキシ「newProxyInstance()メソッドのために作成されたプロキシクラスを使用することですパラメータは、現在のクラスローダタイプであり、2番目のパラメータが実装クラスは、インターフェイスのインスタンスを作成され、3番目のパラメータは、エンハンスメント方法の必要性があります。 この方法では、ターゲットクラスの前と後に行われる、各クラス実行部myBefore()メソッドとmyAfter()メソッド。
6 。JDKProxyTestは、テストクラスを作成し 、以下のように、com.mengma.jdkパッケージでJDKProxyTestと呼ばれるテストクラスを作成します。 パッケージcom.mengma.jdk; インポートorg.junit.Test; インポートcom.mengma.dao.CustomerDao、 パブリック クラスJDKProxyTest { @Test 公共 ボイド試験(){ // 得られたスプリングに対応する(植物から指定されたコンテンツを得るが、ときにこのコンテンツプロキシオブジェクト) customerDao customerDao = MyBeanFactory.getBean(); //は、メソッド実行 customerDao.addを(); customerDao.update(); customerDao.delete(); customerDao.find(); } } 上記のコードでは、得られたgetBean()メソッドを呼び出すときに、オブジェクト内のメソッドを呼び出し、次に、CustomerDaoプロキシオブジェクト・クラスです。 7 。プロジェクトを実行し、結果を表示し 、正常に実行され、()メソッドコンソール出力をJUnitテストの実行テストを使用した後