<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      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 閱讀(664) 評論(0)  編輯  收藏 所屬分類: Java動態代理

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲av午夜精品无码专区| 亚洲国产精品午夜电影| 无码 免费 国产在线观看91| 麻豆国产VA免费精品高清在线| 亚洲欧洲AV无码专区| 巨胸喷奶水视频www网免费| 亚洲精品无码成人片久久不卡| 蜜臀91精品国产免费观看| 亚洲自偷自偷在线成人网站传媒| 免费做爰猛烈吃奶摸视频在线观看 | j8又粗又长又硬又爽免费视频| 亚洲av无码成人精品区在线播放 | 国产免费怕怕免费视频观看| 国产精品亚洲一区二区无码 | 成人免费午夜无码视频| 77777亚洲午夜久久多喷| 国产高清在线免费视频| 永久免费无码网站在线观看个| 亚洲精品无码久久久影院相关影片| 精品一卡2卡三卡4卡免费视频| 亚洲第一区视频在线观看| 思思99re66在线精品免费观看| 粉色视频成年免费人15次| 亚洲精品成人无限看| 日韩免费一区二区三区在线播放| 亚洲综合av一区二区三区 | 青青青国产在线观看免费网站| 亚洲A∨精品一区二区三区下载| 亚洲国产V高清在线观看| 久久国产精品免费专区| 亚洲欧美成人av在线观看| 亚洲日本韩国在线| 亚洲人成免费电影| 噜噜综合亚洲AV中文无码| 亚洲人成网7777777国产| 日本在线高清免费爱做网站| 野花视频在线官网免费1| 亚洲短视频男人的影院| 国产乱子影视频上线免费观看| 成人爽a毛片免费| 亚洲av日韩综合一区二区三区|