1. 程式人生 > >JDK靜態代理、JDK動態代理以及CGLIB動態代理

JDK靜態代理、JDK動態代理以及CGLIB動態代理

這裡轉載兩篇好文章:“深入理解JDK動態代理機制” ,深入理解CGLIB動態代理機制 :
https://www.jianshu.com/p/471c80a7e831
https://www.jianshu.com/p/9a61af393e41?from=timeline&isappinstalled=0

1. JDK 靜態代理和動態代理的比較

JDK靜態代理與JDK動態代理之間
相似之處:

(1) 都要建立代理類,以及代理類都要實現介面。

不同之處
(1) 在靜態代理中我們需要對哪個介面和哪個被代理類建立代理類,所以我們在編譯前就需要代理類實現與被代理類相同的介面。並且直接在實現的方法中呼叫被代理類相應的方法;但是動態代理

則不同,我們不知道要針對哪個介面、哪個被代理類建立代理類,因為它是在執行時被建立的

(2) JDK靜態代理是通過直接編碼建立的,而JDK動態代理是利用反射機制在執行時建立代理類的。

其實在動態代理中,核心是InvocationHandler。每一個代理的例項都會有一個關聯的呼叫處理程式(InvocationHandler)。對待代理例項進行呼叫時,將對方法的呼叫進行編碼並指派到它的呼叫處理器(InvocationHandler)的invoke方法。所以對代理物件例項方法的呼叫都是通過InvocationHandler中的invoke方法來完成的,而invoke方法會根據傳入的代理物件、方法名稱以及引數決定呼叫代理的哪個方法。
所以代理類其實是通過getProxyClass方法來生成的。