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