1. 程式人生 > >AOP與動態代理

AOP與動態代理

什麽 編譯 spec 加載中 cglib 後者 監控 修改 打印

AOP


AOP是指在jvm運行時, 動態將代碼切入到指定位置.

OOP是一個維度上寫代碼, AOP是把他切開來, 變成立體的.

這樣的好處是: 業務邏輯跟輔助邏輯分離,

例如日誌打印, 性能監控, 安全控制等等, 代碼不會搞的很冗余.

跟filter的區別有什麽區別呢, 看上去filter也可以做上述事情,

有請求才會filter, filter也無法更細粒度的控制.

如何切開程序? 答: 通過修改字節碼.

之前設計器那邊用過AspectJ來實現靜態的修改class切入, 這種其實不算動態修改.

因為他是編譯過程中植入代碼的. 例如對設計器中所有的mouse點擊事件進行記錄,

來回溯設計器制作模板的過程.

還有一種是通過asm框架動態的切入class.

ASM


asm是字節碼框架, 可以動態增刪改類的方法等屬性.

字節碼上一層是asm, asm上一層是cglib, 再上一層是應用層.

可以通過asm直接修改class, 也可以用javaassist來修改.

前者速度更快, 但是需要一點匯編命令, 後者是封裝好的api.

實際使用場景


1, 插件的加載中, 在class加載之前增加一些方法.

2, 有一種破解方式就是運行過程中把他的字節碼打印出來, 然後再反編譯看class.

3, 比如想要修改某個jar裏的class, 反編譯出來可能錯誤多多, 可以通過javaassist來直接修改class.

4, javap查看字節碼, 更深入的了解一段代碼是如何執行的, 從哪個棧出來, 放到哪個棧裏.

5, 之前介紹過的BTrace Greys等工具, 他們是attach到jvm上, 通過agent來加載腳本, 通過asm修改class.

產品中的運用


動態代理的兩種方式, cglib和java原生的區別與優劣.

cglib不需要對象有接口, 他是用繼承, 因此類不能是final的.

而java動態代理是通過接口的方式, 因為類需要有接口實現.

1.7裏測試java動態代理更快.

如何使用上述兩種


通過xml配置或者註解.

比如xml中指定某一個類, 某一個方法作為切入點.

或者掃描class method上的註解來判斷是否需要植入代碼.

AOP與動態代理