一、什么是代理?
代理是一種常用的設(shè)計(jì)模式,目的是為洽談對(duì)象提供一個(gè)代理來(lái)控制對(duì)某個(gè)對(duì)象的訪問(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)的訪問(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