創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)專注于洛寧企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都做商城網(wǎng)站。洛寧網(wǎng)站建設(shè)公司,為洛寧等地區(qū)提供建站服務(wù)。全流程按需求定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)摘要
相比于靜態(tài)代理,動(dòng)態(tài)代理避免了開發(fā)人員編寫各個(gè)繁鎖的靜態(tài)代理類,只需簡單地指定一組接口及目標(biāo)類對象就能動(dòng)態(tài)的獲得代理對象。
代理模式

使用代理模式必須要讓代理類和目標(biāo)類實(shí)現(xiàn)相同的接口,客戶端通過代理類來調(diào)用目標(biāo)方法,代理類會(huì)將所有的方法調(diào)用分派到目標(biāo)對象上反射執(zhí)行,還可以在分派過程中添加"前置通知"和后置處理(如在調(diào)用目標(biāo)方法前校驗(yàn)權(quán)限,在調(diào)用完目標(biāo)方法后打印日志等)等功能。
使用動(dòng)態(tài)代理的五大步驟
1.通過實(shí)現(xiàn)InvocationHandler接口來自定義自己的InvocationHandler;
2.通過Proxy.getProxyClass獲得動(dòng)態(tài)代理類
3.通過反射機(jī)制獲得代理類的構(gòu)造方法,方法簽名為getConstructor(InvocationHandler.class)
4.通過構(gòu)造函數(shù)獲得代理對象并將自定義的InvocationHandler實(shí)例對象傳為參數(shù)傳入
5.通過代理對象調(diào)用目標(biāo)方法
動(dòng)態(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");
//獲取動(dòng)態(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)建動(dòng)態(tài)代理對象,將自定義的InvocationHandler實(shí)例傳入
IHello iHello = (IHello) constructor.newInstance(new HWInvocationHandler(new Hello()));
//通過代理對象調(diào)用目標(biāo)方法
iHello.sayHello();
}
}
標(biāo)題名稱:深度剖析java中JDK動(dòng)態(tài)代理機(jī)制-創(chuàng)新互聯(lián)
文章分享:http://www.chinadenli.net/article24/dhecce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、軟件開發(fā)、靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容