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

一、什么是代理?

代理是一種常用的設(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圖:


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

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

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

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

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