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

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

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

    posts - 68, comments - 19, trackbacks - 0, articles - 1

    簡單靜態代理與動態代理

    Posted on 2011-01-29 14:58 viery 閱讀(150) 評論(0)  編輯  收藏 所屬分類: JavaSE

    靜態:
    首先需要一個接口
    public interface Neting {

     public void netting();
     
     public String playGame(String name);
    }
    然后需要一個實例去繼承:

    public class NetImpl implements Neting {

     @Override
     public void netting() {
      System.out.println("上網中....");
     }

     @Override
     public String playGame(String name) {
      System.out.println("游戲中....");
      return "game over";
     }

    }

    最后需要一個同樣實現了相同接口的類來做代理,并在每個方法中加入需要的操作:

    public class NetingImplProxy implements Neting {

     private Neting neting;
     
     public NetingImplProxy(Neting neting){
      this.neting=neting;
     }
     @Override
     public void netting() {
      this.up();
      neting.netting();
      this.down();
     }

     @Override
     public String playGame(String name) {
      this.up();
      String str=neting.playGame(name);
      this.down();
      return str;
     }
     
     private void up(){
      System.out.println("撥號中");
     }
     
     private void down(){
      System.out.println("斷開中");
     }

    }

    這樣產生的結果是每次更改方法中固定的操作時,都需要更改類的源代碼,帶來很多不便,由此產生動態代理。
    動態代理需要一個Proxy類和invocationhandle接口來支持:

    同樣,上述的接口和實現類都不變,不再需要代理類,而是由下面這個類動態產生:
    public class NetHandle implements InvocationHandler {
     
     //首先需要傳一個目標對象的引用
     private Object targetObject;
     
    //設置構造方法時,直接將目標對象作為參數傳入
     public NetHandle(Object targetObject){
      this.targetObject=targetObject;
     }
     
     //這是至關重要的,由此類實例的本方法產生一個$...代理對象:
     public Object createProxyInstance(){
      return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
               targetObject.getClass().getInterfaces(),
               this);
      
     }
    //代理對象會自動調用復寫后的invoke方法,類似filter中的dofilter;
     @Override
     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
      up(); //在此加入需要增加的操作
      Object ret=method.invoke(targetObject, args);
      down();//在此加入需要增加的操作
      return ret;// 如果沒有返回值,則返回null。
     }
     
     private void up(){
      System.out.println("撥號中");
     }
     
     private void down(){
      System.out.println("斷開中");
     }
    }
    測試:
     public static void main(String[] args) {
      
      NetHandle n=new NetHandle(new NetImpl());
      Neting net=(Neting) n.createProxyInstance();
      net.netting();
      System.out.println(net.playGame(""));
     }
    運行結果:
    撥號中
    上網中....
    斷開中
    撥號中
    游戲中....
    斷開中
    game over

    主站蜘蛛池模板: 国产美女视频免费观看的网站| 亚洲三级在线播放| 高清免费久久午夜精品| 精品免费国产一区二区三区| 亚洲天堂免费在线| 欧美在线看片A免费观看| 亚洲中文字幕无码久久2020| 青青久在线视频免费观看| 国产精品久久亚洲不卡动漫| 免费高清av一区二区三区| 日韩欧美亚洲中文乱码| 国产免费人视频在线观看免费| 美女免费视频一区二区| 亚洲七七久久精品中文国产| 中国一级毛片视频免费看| 亚洲AV一宅男色影视| 精品成在人线AV无码免费看 | 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲另类小说图片| 无码中文字幕av免费放| 亚洲av无码专区在线观看下载| 国产免费看插插插视频| 好男人资源在线WWW免费| 91亚洲国产成人精品下载| 国产麻豆视频免费观看| 狠狠热精品免费观看| 国产精品亚洲一区二区三区在线| 性xxxxx大片免费视频| 国产成人精品日本亚洲专一区| 日韩成人免费在线| 最近的2019免费中文字幕| 亚洲欧洲日韩国产| 国产成人啪精品视频免费网| 成人免费无码H在线观看不卡| 亚洲美女大bbbbbbbbb| 免费一级毛片不卡不收费| 久久久久久久99精品免费观看| 77777亚洲午夜久久多喷| 不卡一卡二卡三亚洲| 日本免费xxxx| 一个人免费观看www视频|