动态代理-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中有很是重要的应用。**接口

相关文章
相关标签/搜索