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