jdk中的动态代理和cglib中动态代理的区别
生活随笔
收集整理的這篇文章主要介紹了
jdk中的动态代理和cglib中动态代理的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
jdk中動態(tài)代理:
要求目標(biāo)對象必須實現(xiàn)了某個接口.
代理對象和目標(biāo)對象要想實現(xiàn)相同的功能,在底層的表現(xiàn)是代理對象和目標(biāo)對象實現(xiàn)了相同的接口,因此獲取代理對象后(Object類型),應(yīng)該向下轉(zhuǎn)型為目標(biāo)對象實現(xiàn)的接口類型.
獲取代理對象的工具類:
public class ProxyUtil {//定義一個目標(biāo)對象,為什么?//因為代理對象的目的就是完成目標(biāo)對象實現(xiàn)的功能.private MathImpl mathImpl;public ProxyUtil(MathImpl mathImpl) {this.mathImpl = mathImpl;}//以下方法為了獲得一個代理對象(動態(tài)生成的)public Object getProxy() {//獲取當(dāng)前類的類加載器,用來記載代理對象所屬的類ClassLoader loader = this.getClass().getClassLoader();//獲取目標(biāo)對象實現(xiàn)的所有接口Class[] interfaces = mathImpl.getClass().getInterfaces();return Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("前");//動態(tài)代理對象實現(xiàn)目標(biāo)對象的功能 Object result = method.invoke(mathImpl, args);System.out.println("后");return result;}}); } }其中獲取代理對象方法的每個參數(shù)的意義:
Proxy.newProxyINstance(①ClassLoader,②Interfaces,③InvocationHandler h)①因為創(chuàng)建的代理對象依賴類,只有創(chuàng)建了類加載器加載了這個類,才能產(chǎn)生出代理對象.
ClassLoader loader = this.getClass().getClassLoader();
②只有知道了目標(biāo)對象實現(xiàn)的所以接口,你才能知道代理對象要實現(xiàn)什么功能.
Class[] interfaces = 目標(biāo)對象.getClass().getInterfaces();
③知道了代理對象要實現(xiàn)什么功能后,設(shè)置代理對象如何實現(xiàn)目標(biāo)對象的功能
cglib中動態(tài)代理
要求目標(biāo)對象必須有父類
總結(jié)
以上是生活随笔為你收集整理的jdk中的动态代理和cglib中动态代理的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Spring框架开发会遇到的所有异常
- 下一篇: Eclipse旧版本Luna SR2(版