創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)專注于洛寧企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都做商城網(wǎng)站。洛寧網(wǎng)站建設(shè)公司,為洛寧等地區(qū)提供建站服務(wù)。全流程按需求定制網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)摘要
相比于靜態(tài)代理,動態(tài)代理避免了開發(fā)人員編寫各個繁鎖的靜態(tài)代理類,只需簡單地指定一組接口及目標(biāo)類對象就能動態(tài)的獲得代理對象。
代理模式
使用代理模式必須要讓代理類和目標(biāo)類實現(xiàn)相同的接口,客戶端通過代理類來調(diào)用目標(biāo)方法,代理類會將所有的方法調(diào)用分派到目標(biāo)對象上反射執(zhí)行,還可以在分派過程中添加"前置通知"和后置處理(如在調(diào)用目標(biāo)方法前校驗權(quán)限,在調(diào)用完目標(biāo)方法后打印日志等)等功能。
使用動態(tài)代理的五大步驟
1.通過實現(xiàn)InvocationHandler接口來自定義自己的InvocationHandler;
2.通過Proxy.getProxyClass獲得動態(tài)代理類
3.通過反射機(jī)制獲得代理類的構(gòu)造方法,方法簽名為getConstructor(InvocationHandler.class)
4.通過構(gòu)造函數(shù)獲得代理對象并將自定義的InvocationHandler實例對象傳為參數(shù)傳入
5.通過代理對象調(diào)用目標(biāo)方法
動態(tài)代理的使用
例1(方式一)
public class MyProxy { public interface IHello{ void sayHello(); } static class Hello implements IHello{ public void sayHello() { System.out.println("Hello world!!"); } } //自定義InvocationHandler static class HWInvocationHandler implements InvocationHandler{ //目標(biāo)對象 private Object target; public HWInvocationHandler(Object target){ this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("------插入前置通知代碼-------------"); //執(zhí)行相應(yīng)的目標(biāo)方法 Object rs = method.invoke(target,args); System.out.println("------插入后置處理代碼-------------"); return rs; } } public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetExc eption, InstantiationException { //生成$Proxy0的class文件 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); //獲取動態(tài)代理類 Class proxyClazz = Proxy.getProxyClass(IHello.class.getClassLoader(),IHello.class); //獲得代理類的構(gòu)造函數(shù),并傳入?yún)?shù)類型InvocationHandler.class Constructor constructor = proxyClazz.getConstructor(InvocationHandler.class); //通過構(gòu)造函數(shù)來創(chuàng)建動態(tài)代理對象,將自定義的InvocationHandler實例傳入 IHello iHello = (IHello) constructor.newInstance(new HWInvocationHandler(new Hello())); //通過代理對象調(diào)用目標(biāo)方法 iHello.sayHello(); } }