一、什么是代理?
代理是一種常用的設(shè)計(jì)模式,目的是為洽談對象提供一個(gè)代理來控制對某個(gè)對象的訪問。代理類負(fù)責(zé)為委托類預(yù)處理消息,過濾消息并轉(zhuǎn)發(fā)消息,以及進(jìn)行消息被委托執(zhí)行后的后續(xù)處理。
代理的UML圖:

簡單結(jié)構(gòu)圖實(shí)現(xiàn):

為了保持行為的一致性,代理類和委托類通常會(huì)實(shí)現(xiàn)相同的接口,所以對于客戶端調(diào)用者來說沒有區(qū)別。通過代理這一中間層,能有效的控制對委托類的訪問控制,同時(shí)也為實(shí)施不同控制策略預(yù)留了空間,在設(shè)計(jì)上獲得了更大的靈活性。
二、JDK的動(dòng)態(tài)代理怎么使用?






一路定位源碼,終于找到你了:

/*
* 生成指定代理類字節(jié)碼
* Generate the specified proxy class.
*/
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
proxyName, interfaces);
咱們也想來試試ProxyGenerator的強(qiáng)大:

反編譯生成的代理類:


上面ProxySubject是真正意義的代理類,它實(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.通過Proxy類指定ClassLoader對象和一組interface數(shù)組來創(chuàng)建動(dòng)態(tài)代理類
3.通過反射機(jī)制獲取動(dòng)態(tài)代理類,其唯一參數(shù)就是調(diào)用對象處理器接口類型
Proxy構(gòu)造函數(shù)唯一參數(shù)就是調(diào)用處理器接口類型

4.創(chuàng)建動(dòng)態(tài)代理類,構(gòu)造時(shí)調(diào)用處理器對象作為參數(shù)被傳入
美中不足,JDK動(dòng)態(tài)代理無法擺脫僅依賴interface的枷鎖,動(dòng)態(tài)代理類有一個(gè)共同的父類Proxy,java繼承機(jī)制注定了動(dòng)態(tài)代理類無法對Class的代理,因?yàn)槎嗬^承在java中本質(zhì)上是行不通的。
本文參考:https://www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html