<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 閱讀(151) 評論(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

    主站蜘蛛池模板: 无码乱人伦一区二区亚洲一| 亚洲国产主播精品极品网红| 亚洲高清无在码在线电影不卡| 99在线视频免费观看| 免费精品国自产拍在线播放| 免费看美女被靠到爽的视频| 亚洲熟妇AV乱码在线观看| 午夜免费不卡毛片完整版| 亚洲欧好州第一的日产suv| 无码免费一区二区三区免费播放| 久久精品国产亚洲网站| 日韩电影免费在线观看中文字幕| 婷婷亚洲综合五月天小说| 4399影视免费观看高清直播| 亚洲成a人片毛片在线| 好吊妞788免费视频播放| 爱情岛论坛亚洲品质自拍视频网站| 国产禁女女网站免费看| 国产黄在线观看免费观看不卡| 久久亚洲精品中文字幕三区| 3344永久在线观看视频免费首页| 亚洲国产精品日韩在线| 免费国产在线观看| 三年片在线观看免费| 亚洲一级免费视频| www.91亚洲| 亚欧在线精品免费观看一区| 亚洲精品久久无码av片俺去也| 日本中文一区二区三区亚洲| 未满十八18禁止免费无码网站 | 中文字幕成人免费高清在线 | 亚洲高清国产AV拍精品青青草原| 99视频免费观看| 老司机亚洲精品影院在线观看| 亚洲一区二区三区香蕉| 嫖丰满老熟妇AAAA片免费看| 美女裸体无遮挡免费视频网站| 亚洲AV无码乱码在线观看裸奔| 性生交片免费无码看人| 丝瓜app免费下载网址进入ios| 亚洲一区二区三区乱码在线欧洲|