首頁  >  文章  >  类库下载  >  java動態代理的2種實作方式

java動態代理的2種實作方式

高洛峰
高洛峰原創
2016-11-30 14:59:302388瀏覽

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

實作類別物件呼叫Method物件表示的底層方法。

java動態代理的2種實作方式  第一種實現代理的方式:

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;
    }
}

『 測試碼,不知道大家有沒有,那就是並沒有顯示的調用NumProxyImpl中的invoke方法,可是卻執行了,嗯嗯,這個自己下去看一下啊

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

 

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

java動態代理的2種實作方式

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn