Java JDK動(dòng)態(tài)代理(AOP)使用以及實(shí)現(xiàn)原理

一、什么是代理?

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

代理的UML圖:


代理模式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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0.前言 本文主要想闡述的問題如下:什么動(dòng)態(tài)代理(AOP)以及如何用JDK的Proxy和InvocationHan...
    SYFHEHE閱讀 2,416評(píng)論 1 7
  • title: Jdk動(dòng)態(tài)代理原理解析 tags:代理 categories:筆記 date: 2017-06-14...
    行徑行閱讀 19,651評(píng)論 3 36
  • 祖母信佛,很多年了。 開學(xué)前一天,恰巧表弟的十整歲生日,我原本已經(jīng)忘記了。打電話回家絮叨問起小外甥,祖父說是表弟的...
    是以何兮閱讀 630評(píng)論 0 0
  • 2016年1月28日 生命向上,親子相長 第87篇 宸宸3歲4月,詩詩2月 宸宸非常喜歡妹妹,非常愛照顧妹妹,保護(hù)...
    雪維他閱讀 1,022評(píng)論 0 0
  • 好久不寫文字了,忘了以一種什么方式開場,才不顯得那么做作。傻呆呆地盯著屏幕半天,哼哼唧唧竟然寫不出一句完整的話。怪...
    誰中了罌粟花毒閱讀 518評(píng)論 2 1

友情鏈接更多精彩內(nèi)容