java動態代理的2種實現方式,java動態代理2種

來源:互聯網
上載者:User

java動態代理的2種實現方式,java動態代理2種

java的動態代理在接java的api上有說明,這裡就不寫了。我理解的代理:

  對特定介面中特定方法的功能進行擴充,這就是代理。代理是通過代理執行個體關聯的調用處理常式對象調用方法。

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

  介面:

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

  實作類別:

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("底層方法列印數字99");    }}

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

  

  就是說調用處理常式對介面的實作類別對象調用Method對象表示的底層方法。

  第一種實現代理的方式:

public class NumProxy {    private Object num;
  //通過構造方法構造介面的實作類別對象 public NumProxy(Object num) { this.num = num; } public Object getNumByProxy(){ Object numProxy = Proxy.newProxyInstance(num.getClass().getClassLoader(), new Class[]{Num.class}, new InvocationHandler() { /** * method: 對應於在代理執行個體上調用的介面方法的 Method 執行個體。我理解的就是被代理的真實方法執行個體 * args: 我理解的是真實方法的參數數組 */ @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()結束"); } else if("show".equals(methodName)){ obj = method.invoke(num, args); System.out.println("proxy: show()結束"); } return obj; } }); return numProxy; }}

   第二種實現代理的方式:通過實現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()結束"); }else if("show".equals(methodName)){ System.out.println("proxy: show()開始"); obj = method.invoke(num, args); System.out.println("proxy: show()結束"); } 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(); }}

 控制台結果:

  

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

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

 

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.