簡(jiǎn)述
此文是對(duì) 第6講 | 動(dòng)態(tài)代理是基于什么原理? 的學(xué)習(xí)
一些知識(shí)點(diǎn)/筆記點(diǎn):
- 動(dòng)態(tài)類型與靜態(tài)類型語(yǔ)言
- 語(yǔ)言類型信息是在運(yùn)行時(shí)檢查回还,還是編譯期檢查腕让。
- 強(qiáng)類型和弱類型,就是不同類型變量賦值時(shí)择葡,是否需要顯式地(強(qiáng)制)進(jìn)行類型轉(zhuǎn)換。
- Java 是靜態(tài)的強(qiáng)類型語(yǔ)言剃氧,但是因?yàn)樘峁┝祟愃品瓷涞葯C(jī)制敏储,也具備了部分動(dòng)態(tài)類型語(yǔ)言的能力。
- ==Java 反射機(jī)制==朋鞍,是動(dòng)態(tài)代理的一種
- 通過(guò)反射我們可以直接操作類或者對(duì)象已添,比如獲取某個(gè)對(duì)象的類定義妥箕,獲取類聲明的屬性和方法,調(diào)用方法或者構(gòu)造對(duì)象更舞,甚至可以運(yùn)行時(shí)修改類定義畦幢。
- AOP 使用到了動(dòng)態(tài)代理
- 實(shí)現(xiàn)動(dòng)態(tài)代理有很多方式,Java 反射是一種缆蝉,利用傳說(shuō)中更高性能的字節(jié)碼操作機(jī)制宇葱,類似 ASM、cglib(基于 ASM)刊头、Javassist 等黍瞧。
- 反射機(jī)制內(nèi)容及基本編程場(chǎng)景:Class、Field原杂、Method印颤、Constructor 等,這些完全就是我們?nèi)ゲ僮黝惡蛯?duì)象的元數(shù)據(jù)對(duì)應(yīng)穿肄。
- 反射提供的 AccessibleObject.setAccessible(boolean flag)年局。它的子類也大都重寫了這個(gè)方法,這里的所謂 accessible 可以理解成修飾成員的 public咸产、protected矢否、private,這意味著我們可以在運(yùn)行時(shí)修改成員訪問(wèn)限制锐朴!
- 代理機(jī)制:代理模式兴喂,代理可以看作是對(duì)調(diào)用目標(biāo)的一個(gè)包裝,對(duì)目標(biāo)代碼的調(diào)用不是直接發(fā)生的焚志,而是通過(guò)代理完成衣迷。
- 代理實(shí)現(xiàn)解耦,不關(guān)注內(nèi)部細(xì)節(jié)酱酬。
- 靜態(tài)代理發(fā)展到動(dòng)態(tài)代理
- Spring AOP 支持兩種模式的動(dòng)態(tài)代理壶谒,JDK Proxy 或者 cglib,cglib 方式對(duì)接口的依賴被克服了膳沽。
- JDK Proxy 和 cglib 優(yōu)勢(shì)對(duì)比
JDK Proxy 的優(yōu)勢(shì):
最小化依賴關(guān)系汗菜,減少依賴意味著簡(jiǎn)化開發(fā)和維護(hù),JDK 本身的支持挑社,可能比 cglib 更加可靠陨界。
平滑進(jìn)行 JDK 版本升級(jí),而字節(jié)碼類庫(kù)通常需要進(jìn)行更新以保證在新版 Java 上能夠使用痛阻。
代碼實(shí)現(xiàn)簡(jiǎn)單菌瘪。
基于類似 cglib 框架的優(yōu)勢(shì):
有的時(shí)候調(diào)用目標(biāo)可能不便實(shí)現(xiàn)額外接口,從某種角度看,限定調(diào)用者實(shí)現(xiàn)接口是有些侵入性的實(shí)踐俏扩,類似 cglib 動(dòng)態(tài)代理就沒(méi)有這種限制糜工。
只操作我們關(guān)心的類,而不必為其他相關(guān)類增加工作量录淡。
高性能捌木。
- AOP 的目的和能力,簡(jiǎn)單來(lái)說(shuō)它可以看作是對(duì) OOP 的一個(gè)補(bǔ)充嫉戚,因?yàn)?OOP 對(duì)于跨越不同對(duì)象或類的分散刨裆、糾纏邏輯表現(xiàn)力不夠,比如在不同模塊的特定階段做一些事情彬檀,類似日志崔拥、用戶鑒權(quán)、全局性異常處理凤覆、性能監(jiān)控,甚至事務(wù)處理等拆魏。
Java 源碼的學(xué)習(xí)
可以參照之前的一篇文章:Java源碼學(xué)習(xí)