模式的秘密-代理模式(2)-JDK動態代理
阿新 • • 發佈:2018-03-05
handler ins strong alt mov .... implement class 以及
代理模式-動態代理
(1)
(2)
代碼實踐動態代理:
第一步:被代理類的接口:
package com.JdkProxy; public interface Moveable { void move(); }
第二步:被代理類:
package com.JdkProxy; import java.util.Random; public class Car implements Moveable { @Override public void move() { //實現開車 try { Thread.sleep(new Random().nextInt(1000)); System.out.println("汽車行駛中...."); } catch (InterruptedException e) { e.printStackTrace(); } } }
第三步:代理類:實現接口:InvocationHandler,同時把被代理類對象接口傳入構造方法,
重寫的接口的invoke方法。
package com.JdkProxy; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method; public class TimeHandler implements InvocationHandler { private Object target; public TimeHandler(Object target) { this.target=target; } /* * 參數: * proxy:被代理對象 * method:被代理對象方法 * arg:方法的參數 * 返回值: * Object 方法的返回值 **/ @Override public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { long starttime=System.currentTimeMillis(); System.out.println("汽車開始形式...."); method.invoke(target); long endtime=System.currentTimeMillis(); System.out.println("汽車結束行駛...汽車形式時間:"+(endtime-starttime)+"毫秒"); return null; } }
測試類中實現代理:
使用Proxy類的newProxyInstance方法產生一個被代理類的實例,該實例可以當作被代理類使用接口(對應cls.getInterfaces())中聲明過的方法。
package com.JdkProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { /*JDK動態代理測試類 * */ public static void main(String[] args) { Car car=new Car(); //InvocationHandler是一個接口,接口中定義了一個方法invoke。要想實現JDK動態代理, //代理類必須繼承這個接口 InvocationHandler h=new TimeHandler(car);// Class cls=car.getClass();//獲取類對象,以便獲取類加載器,以及獲取類的接口 /* * newProxyInstance返回代理類的實例,返回後的代理類可以當作被代理類使用 * (可使用被代理類的接口中聲明過的方法) * loader:類加載器 * interfaces:實現接口 * h:InvocationHandler * */ Moveable m=(Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h); m.move(); } }
測試結果:
汽車開始形式....
汽車行駛中....
汽車結束行駛...汽車形式時間:863毫秒
代理模式-動態代理
所以動態代理是這樣一種Class:
- 他在運行時候產生了的Class
- 該class需要實現一組interface
- 使用動態代理類時,必須實現InvocationHandler接口
動態代理實現步驟
1,創建一個實現InvocationHandler的類,他必須實現Invoke方法
2,創建被代理的類以及接口
3,調用Proxy的靜態方法,創建一個代理類:
newProxyInstance(ClassLoader,class[] interfaces,InvocationHandler h)。
4,通過代理調用方法。
jdk動態代理只能實現了接口的類。
模式的秘密-代理模式(2)-JDK動態代理