<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

    主站蜘蛛池模板: 亚洲爆乳大丰满无码专区| 国产VA免费精品高清在线| 亚洲中文字幕精品久久| 国产成人综合亚洲绿色| 污污网站免费观看| 免费少妇a级毛片| 亚洲午夜精品一区二区公牛电影院| 国产AV日韩A∨亚洲AV电影| 妞干网免费观看视频| 亚洲av日韩av不卡在线观看| 亚洲a无码综合a国产av中文| 久久国产精品免费视频| 亚洲国产成人精品91久久久| 亚洲AV无码国产精品色| 最近免费mv在线观看动漫| av无码东京热亚洲男人的天堂| 精品亚洲国产成人| 精品剧情v国产在免费线观看| 亚洲大尺码专区影院| 免费黄色电影在线观看| 久久亚洲精品无码播放| 亚洲精品精华液一区二区| 国产大片91精品免费观看男同| 亚洲综合中文字幕无线码| 精品无码国产污污污免费网站| 亚洲人成网亚洲欧洲无码久久| 美女被羞羞网站免费下载| 成人AV免费网址在线观看| 1区1区3区4区产品亚洲| 国色精品va在线观看免费视频| 久久精品国产亚洲av麻豆小说| 中文在线免费视频| 在线观看亚洲精品国产| 一级毛片免费播放男男| 亚洲国产香蕉人人爽成AV片久久 | 亚洲第一区在线观看| 曰批全过程免费视频在线观看无码 | 99xxoo视频在线永久免费观看| 久久久久亚洲AV成人网人人网站| 免费在线观看一级片| 亚洲国产精品日韩av不卡在线|