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