欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

下面通過一個例子看一下:

接口:

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

實現(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中是怎么描述的

就是說調(diào)用處理程序?qū)涌诘膶崿F(xiàn)類對象調(diào)用Method對象表示的底層方法。

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

public class NumProxy {
  private Object num;

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

  public Object getNumByProxy(){
    Object numProxy = Proxy.newProxyInstance(num.getClass().getClassLoader(), new Class[]{Num.class}, new InvocationHandler() {
      /**
       * method: 對應(yīng)于在代理實例上調(diào)用的接口方法的 Method 實例。我理解的就是被代理的真實方法實例
       * args: 我理解的是真實方法的參數(shù)數(shù)組
       */
      @Override
      public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable {
        Object obj = null;
        System.out.println("在方法之前開始記錄");
        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;
  }
}

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

public class NumProxyImpl implements InvocationHandler {
  //這里我把接口類型具體化了, 沒有寫成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()開始");
      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()開始");
      obj = method.invoke(num, args);
      System.out.println("proxy: show()結(jié)束");
    }
    return obj;
  }
}

測試代碼:

public class TestNum {
  public static void main(String[] args) {
    //兩種方式一起測試
    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();
  }
}

控制臺結(jié)果:

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

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

比如編碼的處理就可以用到代理,下次寫個例子。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?RabbitMQ消息隊列詳解常見問題

    Java?RabbitMQ消息隊列詳解常見問題

    消息隊列是最古老的中間件之一,從系統(tǒng)之間有通信需求開始,就自然產(chǎn)生了消息隊列。本文告訴什么是消息隊列,為什么需要消息隊列,常見的消息隊列有哪些,RabbitMQ的部署和使用
    2022-07-07
  • JDK19新特性使用實例詳解

    JDK19新特性使用實例詳解

    這篇文章主要為大家介紹了JDK19新特性使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • JAVA如何使用Math類操作數(shù)據(jù)

    JAVA如何使用Math類操作數(shù)據(jù)

    這篇文章主要介紹了JAVA如何使用Math類操作數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java SpringBoot集成ChatGPT實現(xiàn)AI聊天

    Java SpringBoot集成ChatGPT實現(xiàn)AI聊天

    ChatGPT已經(jīng)組件放開了,現(xiàn)在都可以基于它寫插件了,也許可以用它結(jié)合文字語音開發(fā)一個老人小孩需要的智能的說話陪伴啥的,這篇文章就介紹SpringBoot結(jié)合ChatGPT實現(xiàn)AI聊天感興趣的同學可以借鑒一下
    2023-04-04
  • Java棧和基礎(chǔ)隊列的實現(xiàn)詳解

    Java棧和基礎(chǔ)隊列的實現(xiàn)詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊列,在Java的時候,對于棧與隊列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學習時候能夠有扎實的基礎(chǔ)能力。本文小編就來詳細說說Java中的棧與隊列,需要的朋友可以參考一下
    2022-02-02
  • Spring MVC學習教程之RequestMappingHandlerAdapter詳解

    Spring MVC學習教程之RequestMappingHandlerAdapter詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC學習教程之RequestMappingHandlerAdapter的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-11-11
  • Spring Boot + Mybatis多數(shù)據(jù)源和動態(tài)數(shù)據(jù)源配置方法

    Spring Boot + Mybatis多數(shù)據(jù)源和動態(tài)數(shù)據(jù)源配置方法

    最近做項目遇到這樣的應(yīng)用場景,項目需要同時連接兩個不同的數(shù)據(jù)庫A, B,并且它們都為主從架構(gòu),一臺寫庫,多臺讀庫。下面小編給大家?guī)砹薙pring Boot + Mybatis多數(shù)據(jù)源和動態(tài)數(shù)據(jù)源配置方法,需要的朋友參考下吧
    2018-01-01
  • Spring使用RestTemplate模擬form提交示例

    Spring使用RestTemplate模擬form提交示例

    本篇文章主要介紹了Spring使用RestTemplate模擬form提交示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 淺談Java實現(xiàn)回溯算法之八皇后問題

    淺談Java實現(xiàn)回溯算法之八皇后問題

    八皇后問題是一個古老而又著名的問題,是學習回溯算法的一個經(jīng)典案例。今天我們就一起來探究一下吧
    2021-06-06
  • Spring中三種常見Bean的初始化參數(shù)機制你了解嗎

    Spring中三種常見Bean的初始化參數(shù)機制你了解嗎

    在Spring框架中,Bean的實例化與初始化是一個復(fù)雜的過程,本文我們主要來聊一聊它的常見的三種機制:InitializingBean接口、BeanDefinitionRegistryPostProcessor接口和EnvironmentAware接口,感興趣的小伙伴可以了解下
    2023-11-11

最新評論