動態代理-JDK動態代理實現

Jdk動態代理只支持實現接口方式的代理,換句話說,只能代理實現接口的類,若是要實現一個沒有實現接口類的代理,能夠使用CGLib的方式,後面咱們再研究該方式。java

首先咱們來看一下和JDK動態代理相關的類:<br> Proxy:位於java.lang.reflect包下,主要的做用是生成一個代理類。ide

/**
        * loader  : 被代理類的類加載器
        * interfaces : 被代理類實現的接口
        * h  : 對代理類進行加強實現的InvocationHandler
    **/
     public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)

下面咱們經過一個簡單的demo來實現jdk的動態代理:<br> 首先建立一個汽車接口:<br>測試

public interface Car {
    void move();
}

而後建立該接口的實現類:<br>this

public class DaZhongCar implements Car {
    @Override
    public void move() {
        System.out.println("大衆車開始行駛...");
    }
}

建立Car的代理類:<br>代理

public class CarProxy implements InvocationHandler {

    public Object obj;

    public CarProxy(Object obj) {
        this.obj = obj;
    }

    /**
     * @param proxy  代理對象
     * @param method 代理對象執行的方法
     * @param args   方法參數
     * @return 返回值就是代理方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        long start = System.currentTimeMillis();
        System.out.println("開始執行時間:" + start);

        Object result = method.invoke(obj, args);

        long end = System.currentTimeMillis();
        System.out.println("結束執行時間:" + end);

        return result;
    }
}

到此爲止已經實現完了,下面經過main方法來測試一下<br>code

public class Main {

    public static void main(String[] args) {

        Car dazhong = new DaZhongCar();

        CarProxy proxy = new CarProxy(dazhong);

        Car proxyCar = (Car) Proxy.newProxyInstance(dazhong.getClass().getClassLoader(), dazhong.getClass().getInterfaces(), proxy);

        proxyCar.move();
    }
    
}

運行結果:<br>對象

開始執行時間:1509939962338
大衆車開始行駛...
結束執行時間:1509939962340

咱們經過代理類CarProxy來對move()方法來進行加強實現,添加了時間記錄的功能。 ** JDK動態代理在SpringAOP和MyBatis中有很是重要的應用。**接口

相關文章
相關標籤/搜索