一、什么是代理繁莹?
代理是一種常用的設(shè)計(jì)模式,目的是為洽談對(duì)象提供一個(gè)代理來(lái)控制對(duì)某個(gè)對(duì)象的訪(fǎng)問(wèn)特幔。代理類(lèi)負(fù)責(zé)為委托類(lèi)預(yù)處理消息咨演,過(guò)濾消息并轉(zhuǎn)發(fā)消息,以及進(jìn)行消息被委托執(zhí)行后的后續(xù)處理蚯斯。
代理的UML圖:
簡(jiǎn)單結(jié)構(gòu)圖實(shí)現(xiàn):
為了保持行為的一致性薄风,代理類(lèi)和委托類(lèi)通常會(huì)實(shí)現(xiàn)相同的接口饵较,所以對(duì)于客戶(hù)端調(diào)用者來(lái)說(shuō)沒(méi)有區(qū)別。通過(guò)代理這一中間層遭赂,能有效的控制對(duì)委托類(lèi)的訪(fǎng)問(wèn)控制循诉,同時(shí)也為實(shí)施不同控制策略預(yù)留了空間,在設(shè)計(jì)上獲得了更大的靈活性撇他。
二茄猫、JDK的動(dòng)態(tài)代理怎么使用?
一路定位源碼困肩,終于找到你了:
/*
* 生成指定代理類(lèi)字節(jié)碼
* Generate the specified proxy class.
*/
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
proxyName, interfaces);
咱們也想來(lái)試試ProxyGenerator的強(qiáng)大:
反編譯生成的代理類(lèi):
上面ProxySubject是真正意義的代理類(lèi)募疮,它實(shí)現(xiàn)了Proxy并實(shí)現(xiàn)了Subject接口。
Subject obj=?(Subject)?Proxy.newProxyInstance(loader,?interfaces,?handler);
這個(gè)Subject實(shí)際上是被代理接口的一個(gè)實(shí)例僻弹。
總結(jié):
1.實(shí)現(xiàn)InvocationHandler接口創(chuàng)建自己的調(diào)用處理器
2.通過(guò)Proxy類(lèi)指定ClassLoader對(duì)象和一組interface數(shù)組來(lái)創(chuàng)建動(dòng)態(tài)代理類(lèi)
3.通過(guò)反射機(jī)制獲取動(dòng)態(tài)代理類(lèi)阿浓,其唯一參數(shù)就是調(diào)用對(duì)象處理器接口類(lèi)型
Proxy構(gòu)造函數(shù)唯一參數(shù)就是調(diào)用處理器接口類(lèi)型
4.創(chuàng)建動(dòng)態(tài)代理類(lèi),構(gòu)造時(shí)調(diào)用處理器對(duì)象作為參數(shù)被傳入
美中不足蹋绽,JDK動(dòng)態(tài)代理無(wú)法擺脫僅依賴(lài)interface的枷鎖芭毙,動(dòng)態(tài)代理類(lèi)有一個(gè)共同的父類(lèi)Proxy,java繼承機(jī)制注定了動(dòng)態(tài)代理類(lèi)無(wú)法對(duì)Class的代理卸耘,因?yàn)槎嗬^承在java中本質(zhì)上是行不通的退敦。
本文參考:https://www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html