之前介紹的反射和注解都是Java中的動態(tài)特性,還有即將介紹的動態(tài)代理也是Java中的一個動態(tài)特性。這些動態(tài)特性使得我們的程序很靈活。動態(tài)代理是面向AOP編程的基礎。通過動態(tài)代理,我們可以在運行時動態(tài)創(chuàng)建一個類,實現某些接口中的方法,目前為止該特性已被廣泛應用于各種框架和類庫中,例如:Spring,Hibernate,MyBatis等。理解動態(tài)代理是理解框架底層的基礎。
主要內容如下:
理解代理是何意
Java SDK實現動態(tài)代理
第三方庫cglib實現動態(tài)代理
一、代理的概念
單從字面上理解,代理就是指原對象的委托人,它不是原對象但是卻有原對象的權限。Java中的代理意思類似,就是指通過代理來操作原對象的方法和屬性,而原對象不直接出現。這樣做有幾點好處:
節(jié)省創(chuàng)建原對象的高開銷,創(chuàng)建一個代理并不會立馬創(chuàng)建一個實際原對象,而是保存一個原對象的地址,按需加載
執(zhí)行權限檢查,保護原對象
實際上代理堵在了原對象的前面,在代理的內部往往還是調用了原對象的方法,只是它還做了其他的一些操作。下面看第一種實現動態(tài)代理的方式。
二、Java SDK實現動態(tài)代理
實現動態(tài)代理主要有如下幾個步驟:
實現 InvocationHandler接口,完成自定義調用處理器
通過Proxy的getProxyClass方法獲取對應的代理類
利用反射技術獲取該代理類的constructor構造器
利用constructor構造代理實例對象