這篇文章主要講CGLib的一個應用方面——動態代理java
以前咱們有講到ASM,但它至關因而 jvm的 「彙編語言」 仍是太底層,寫起來很麻煩。因而有了CGLibbash
CGLib 是一個 能夠動態修改 .class字節碼的工具。它基於 ASM,在ASM的基礎上作了封裝,屏蔽了底層細節,並向上提升一些高級的API抽象。jvm
CGLib封裝程度高,簡單、容易上手,所以名氣反而必 ASM 還大。(充分告訴咱們,簡單易使用在任何領域都是多麼的重要)工具
cglib 的應用範圍很廣, 動態代理只是其中的一個應用,不要認爲 cglib就只能作動態代理。post
目標類沒有被 final 關鍵字修飾性能
既然是代理,那確定要涉及ui
並且代理類必需要和目標類是同一個類型!spa
什麼意思3d
好比有下面這樣一個方法,它的參數爲 HelloWorld 類型代理
public void hello(HelloWorld helloWorld) {
return helloWorld.sayHello();
}
複製代碼
假設你要代理 HelloWorld 類中的 sayHello() 方法,你的代理類叫 HelloWorldProxy。若是HelloWorldProxy 和 HelloWorld 沒有任何關係的話,那麼它沒法做爲參數傳遞給hello()方法。
因此說 代理類必需要和目標類是同一個類型!
這裏的「同一個類型」指的是
從上面能夠看到,兩種方式都有限制。
第一種方式,依賴於目標類的接口,若是目標了沒有接口,就沒法實現。第二種方式,依賴於目標類沒有被 final 關鍵字修飾
java動態代理技術就是基於第一種方式實現的。而cglib選擇第二種方式,比較一個類沒有接口的狀況不少,但被 final 關鍵字修飾的狀況不多。
cglib能夠在運行時,動態生成一個代理類繼承咱們的目標類,並重寫了目標方法。
以下
動態生成的代理類,在代理方法中 調用了父類(目標類)的目標方法,並在調用先後作了一些處理。
CGLIb爲了提升性能,還用了一種叫作FastClass的方式來直接調用一個對象的方法,而不是經過反射。 至於什麼是 FastClass的方式,以後在寫篇文章