<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免费观看不卡| 91福利视频免费| 久久亚洲高清观看| 一个人看的www在线观看免费| 国产精品亚洲一区二区三区 | 亚洲av永久无码精品古装片| 97免费人妻无码视频| 边摸边吃奶边做爽免费视频网站 | 精品成人一区二区三区免费视频| 亚洲精品国产成人片| 美女被cao免费看在线看网站| yy一级毛片免费视频| 亚洲国语在线视频手机在线| 亚洲精品无码成人片在线观看| 91免费福利精品国产| 污视频网站免费观看| 亚洲熟妇无码久久精品| 亚洲成AV人在线观看网址| 亚洲毛片在线免费观看| free哆拍拍免费永久视频| 激情综合亚洲色婷婷五月APP| 国产国拍精品亚洲AV片| 日韩免费无砖专区2020狼| 久久一本岛在免费线观看2020 | 成人黄色免费网站| 久久最新免费视频| 亚洲JIZZJIZZ妇女| 亚洲综合久久成人69| 国产亚洲情侣一区二区无码AV | 亚洲国产精品成人一区| 成人免费午夜在线观看| 99视频免费播放| av午夜福利一片免费看久久| 亚洲精品成a人在线观看☆| 久久精品亚洲中文字幕无码麻豆| 久久夜色精品国产亚洲av | 亚洲精品高清在线| 精品久久久久久久免费加勒比| 18禁男女爽爽爽午夜网站免费| 在线观看人成视频免费无遮挡| 曰批全过程免费视频免费看|