之前介紹的反射和注解都是Java中的動(dòng)態(tài)特性,還有即將介紹的動(dòng)態(tài)代理也是Java中的一個(gè)動(dòng)態(tài)特性。這些動(dòng)態(tài)特性使得我們的程序很靈活。動(dòng)態(tài)代理是面向AOP編程的基礎(chǔ)。通過動(dòng)態(tài)代理,我們可以在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建一個(gè)類,實(shí)現(xiàn)某些接口中的方法,目前為止該特性已被廣泛應(yīng)用于各種框架和類庫中,例如:Spring,Hibernate,MyBatis等。理解動(dòng)態(tài)代理是理解框架底層的基礎(chǔ)。
主要內(nèi)容如下:
理解代理是何意
Java SDK實(shí)現(xiàn)動(dòng)態(tài)代理
第三方庫cglib實(shí)現(xiàn)動(dòng)態(tài)代理
一、代理的概念
單從字面上理解,代理就是指原對(duì)象的委托人,它不是原對(duì)象但是卻有原對(duì)象的權(quán)限。Java中的代理意思類似,就是指通過代理來操作原對(duì)象的方法和屬性,而原對(duì)象不直接出現(xiàn)。這樣做有幾點(diǎn)好處:
節(jié)省創(chuàng)建原對(duì)象的高開銷,創(chuàng)建一個(gè)代理并不會(huì)立馬創(chuàng)建一個(gè)實(shí)際原對(duì)象,而是保存一個(gè)原對(duì)象的地址,按需加載
執(zhí)行權(quán)限檢查,保護(hù)原對(duì)象
實(shí)際上代理堵在了原對(duì)象的前面,在代理的內(nèi)部往往還是調(diào)用了原對(duì)象的方法,只是它還做了其他的一些操作。下面看第一種實(shí)現(xiàn)動(dòng)態(tài)代理的方式。
二、Java SDK實(shí)現(xiàn)動(dòng)態(tài)代理
實(shí)現(xiàn)動(dòng)態(tài)代理主要有如下幾個(gè)步驟:
實(shí)現(xiàn) InvocationHandler接口,完成自定義調(diào)用處理器
通過Proxy的getProxyClass方法獲取對(duì)應(yīng)的代理類
利用反射技術(shù)獲取該代理類的constructor構(gòu)造器
利用constructor構(gòu)造代理實(shí)例對(duì)象
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26