少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          Java動態代理實現

          Kongxx

          在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。

          其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。

          Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現,如下,HelloWorld接口定義的業務方法,HelloWorldImplHelloWorld接口的實現,HelloWorldHandlerInvocationHandler接口實現。代碼如下:

          業務接口:

          public interface HelloWorld {

                 void sayHelloWorld() ;

          }

          業務接口實現:

          public class HelloWorldImpl implements HelloWorld {

           

                 public void sayHelloWorld() {

                        System.out.println("Hello World!");            

                 }

          }

          InvocationHandler實現,需要在接口方法調用前后加入一部份處理工作,這里僅僅在方法調用前后向后臺輸出兩句字符串,其代碼如下:

          import java.lang.reflect.InvocationHandler;

          import java.lang.reflect.Method;

          public class HelloWorldHandler implements InvocationHandler {

                 //要代理的原始對象

                 private Object objOriginal;

                 /**

                  * 構造函數。

                  * @param obj 要代理的原始對象。

                  */

                 public HelloWorldHandler(Object obj) {

                        this.objOriginal = obj ;

                 }

                 public Object invoke(Object proxy, Method method, Object[] args)

                               throws Throwable {

                       

                        Object result ;

                       

                  //方法調用之前

                        doBefore();

                       

                  //調用原始對象的方法

                        result = method.invoke(this.objOriginal ,args);

                       

                  //方法調用之后

                        doAfter();

                       

                        return result ;

                 }

                

                 private void doBefore() {

                        System.out.println("before method invoke!");

                 }

                

                 private void doAfter() {

                        System.out.println("after method invoke!");

                 }

          }

          測試代碼:

          import java.lang.reflect.InvocationHandler;

          import java.lang.reflect.Proxy;

           

           

           

           

           

           

          public class Test {

           

           

           

           

           

           

                 public static void main(String[] args) {

           

           

           

           

           

           

                        HelloWorld hw = new HelloWorldImpl();

                       

                        InvocationHandler handler = new HelloWorldHandler(hw);

                       

                        HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

                                      hw.getClass().getClassLoader(),

                                      hw.getClass().getInterfaces(),

                                      handler);

           

                        proxy.sayHelloWorld();

                 }

          }

          Ø         首先獲取一個業務接口的實現對象;

          Ø         獲取一個InvocationHandler實現,此處是HelloWorldHandler對象;

          Ø         創建動態代理對象;

          Ø         通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前后輸出兩句字符串。

          運行測試類輸出如下:

          before method invoke!

          Hello World!

          after method invoke!

          此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP

          http://www.cnblogs.com/kongxx/archive/2005/08/08/209749.html 

          posted on 2012-09-07 00:22 abin 閱讀(662) 評論(0)  編輯  收藏 所屬分類: Java動態代理

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 泰州市| 洪湖市| 克东县| 潜山县| 敦化市| 尉犁县| 肇州县| 岳池县| 呈贡县| 尼勒克县| 孟津县| 梓潼县| 宣威市| 拜城县| 林周县| 林芝县| 开江县| 巴南区| 虞城县| 东台市| 通化县| 顺平县| 黔西县| 隆回县| 锦州市| 东乡族自治县| 刚察县| 建始县| 绥芬河市| 左云县| 广西| 屏南县| 富川| 南安市| 马龙县| 巴马| 开鲁县| 海丰县| 梁平县| 同心县| 永平县|