最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解java動(dòng)態(tài)代理的2種實(shí)現(xiàn)方式

 更新時(shí)間:2016年11月30日 09:54:05   作者:眺望小寒山  
目前Java開(kāi)發(fā)包中包含了對(duì)動(dòng)態(tài)代理的支持,但是其實(shí)現(xiàn)只支持對(duì)接口的的實(shí)現(xiàn)。這篇文章主要介紹了詳解java動(dòng)態(tài)代理的2種實(shí)現(xiàn)方式 ,有興趣的可以了解一下。

java的動(dòng)態(tài)代理在接java的api上有說(shuō)明,這里就不寫(xiě)了。我理解的代理:

對(duì)特定接口中特定方法的功能進(jìn)行擴(kuò)展,這就是代理。代理是通過(guò)代理實(shí)例關(guān)聯(lián)的調(diào)用處理程序?qū)ο笳{(diào)用方法。

下面通過(guò)一個(gè)例子看一下:

接口:

public interface Num {
  void show();
  
  int getNum();
  
  int getProduct(int x);
}

實(shí)現(xiàn)類:

public class MyNum implements Num {
  @Override
  public int getNum() {
    return 3;
  }
  
  @Override
  public int getProduct(int x) {
    return x;
  }

  @Override
  public void show() {
    System.out.println("底層方法打印數(shù)字99");
  }
}

先看一下Method中的invoke方法在api中是怎么描述的

就是說(shuō)調(diào)用處理程序?qū)涌诘膶?shí)現(xiàn)類對(duì)象調(diào)用Method對(duì)象表示的底層方法。

第一種實(shí)現(xiàn)代理的方式:

public class NumProxy {
  private Object num;

  //通過(guò)構(gòu)造方法構(gòu)造接口的實(shí)現(xiàn)類對(duì)象
  public NumProxy(Object num) {
    this.num = num;
  }

  public Object getNumByProxy(){
    Object numProxy = Proxy.newProxyInstance(num.getClass().getClassLoader(), new Class[]{Num.class}, new InvocationHandler() {
      /**
       * method: 對(duì)應(yīng)于在代理實(shí)例上調(diào)用的接口方法的 Method 實(shí)例。我理解的就是被代理的真實(shí)方法實(shí)例
       * args: 我理解的是真實(shí)方法的參數(shù)數(shù)組
       */
      @Override
      public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable {
        Object obj = null;
        System.out.println("在方法之前開(kāi)始記錄");
        String methodName = method.getName();
        if("getProduct".equals(methodName)){
          obj = method.invoke(num, args);
          obj = (Integer) obj * 2;
          System.out.println("proxy: getProduct()結(jié)束");
        }
        else if("show".equals(methodName)){
          obj = method.invoke(num, args);
          System.out.println("proxy: show()結(jié)束");
        }
        return obj;
      }
    });
    return numProxy;
  }
}

第二種實(shí)現(xiàn)代理的方式:通過(guò)實(shí)現(xiàn)InvocationHandler接口

public class NumProxyImpl implements InvocationHandler {
  //這里我把接口類型具體化了, 沒(méi)有寫(xiě)成Object
  private Num num;
  
  public NumProxyImpl(Num num){
    this.num = num;
  }
  
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    Object obj = null;
    String methodName = method.getName();
    if("getProduct".equals(methodName)){
      System.out.println("proxy: getProduct()開(kāi)始");
      obj = method.invoke(num, args);
      obj = (Integer) obj * 2;
      System.out.println("proxy: getProduct()結(jié)束");
    }else if("show".equals(methodName)){
      System.out.println("proxy: show()開(kāi)始");
      obj = method.invoke(num, args);
      System.out.println("proxy: show()結(jié)束");
    }
    return obj;
  }
}

測(cè)試代碼:

public class TestNum {
  public static void main(String[] args) {
    //兩種方式一起測(cè)試
    NumProxy np = new NumProxy(new MyNum());
    Num numProxy = (Num) np.getNumByProxy();
    int x = numProxy.getProduct(2);
    System.out.println(x);
    numProxy.show();
    
    System.out.println("----------------");
    NumProxyImpl npi = new NumProxyImpl(new MyNum());
    Num numPro = (Num) Proxy.newProxyInstance(Num.class.getClassLoader(), new Class[]{Num.class}, npi);
    int n = numPro.getProduct(3);
    System.out.println(n);
    numPro.show();
  }
}

控制臺(tái)結(jié)果:

第二種方式有點(diǎn)小疑惑,不知道大家有沒(méi)有,那就是并沒(méi)有顯示的調(diào)用NumProxyImpl中的invoke方法,可是卻執(zhí)行了,嗯嗯,這個(gè)自己下去看一下啊

不想麻煩的只需要記住就行了。

比如編碼的處理就可以用到代理,下次寫(xiě)個(gè)例子。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋)

    Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋)

    這篇文章主要介紹了Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java方法能定義多少個(gè)參數(shù)你知道嗎

    Java方法能定義多少個(gè)參數(shù)你知道嗎

    這篇文章主要給大家介紹了關(guān)于Java方法能定義多少個(gè)參數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 在webservice里調(diào)用耗時(shí)方法出錯(cuò)的解決方案

    在webservice里調(diào)用耗時(shí)方法出錯(cuò)的解決方案

    這篇文章主要介紹了在webservice里調(diào)用耗時(shí)方法出錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 關(guān)于Idea清除緩存并重啟解決的問(wèn)題

    關(guān)于Idea清除緩存并重啟解決的問(wèn)題

    這篇文章主要介紹了關(guān)于Idea清除緩存并重啟解決的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • IDEA打包普通web項(xiàng)目操作

    IDEA打包普通web項(xiàng)目操作

    這篇文章主要介紹了IDEA打包普通web項(xiàng)目操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • SpringBoot+React實(shí)現(xiàn)計(jì)算個(gè)人所得稅

    SpringBoot+React實(shí)現(xiàn)計(jì)算個(gè)人所得稅

    本文將以個(gè)人所得稅的計(jì)算為例,使用React+SpringBoot+GcExcel來(lái)實(shí)現(xiàn)這一功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-09-09
  • Spring Boot Starter 自動(dòng)裝配原理全解析

    Spring Boot Starter 自動(dòng)裝配原理全解析

    Spring Boot Starter 的核心設(shè)計(jì)理念是 約定優(yōu)于配置,其核心實(shí)現(xiàn)基于 自動(dòng)配置(Auto-Configuration) 和 條件化注冊(cè)(Conditional Registration),這篇文章主要介紹了Spring Boot Starter 自動(dòng)裝配原理全解析,需要的朋友可以參考下
    2025-04-04
  • Java 十大排序算法之希爾排序刨析

    Java 十大排序算法之希爾排序刨析

    希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡(jiǎn)單插入排序經(jīng)過(guò)改進(jìn)之后的一個(gè)更高效的版本,也稱為縮小增量排序,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會(huì)以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)
    2021-11-11
  • 基于logback.xml不生效問(wèn)題的解決

    基于logback.xml不生效問(wèn)題的解決

    這篇文章主要介紹了基于logback.xml不生效問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例

    java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例

    這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對(duì)字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

鱼台县| 缙云县| 民乐县| 平凉市| 榆树市| 岳阳市| 沙坪坝区| 乐亭县| 邵阳县| 买车| SHOW| 莆田市| 池州市| 绥宁县| 五大连池市| 通海县| 屏山县| 张家港市| 安丘市| 石嘴山市| 隆化县| 额敏县| 新化县| 行唐县| 建水县| 资中县| 永丰县| 革吉县| 泽州县| 北流市| 商水县| 乳源| 咸阳市| 泰州市| 墨玉县| 宁津县| 迭部县| 阳原县| 阿鲁科尔沁旗| 青龙| 多伦县|