動態代理jdk和cglib的區別
動態代理的描述在前兩篇文章已經做了一部分描述和,JDK的動態代理只能針對實現了介面的類生成代理。而cglib的動態代理是針對類實現代理,這兩種代理我們可以靈活使用。我們透過汽車跑的例子來解讀這兩種動態代理。
一.JDK動態代理
Car介面
package proxy;public interface Car { public void run(); }
Car實現類
package proxy;public class CarImpl implements Car{ public void run() { System.out.println("car running"); } }
Car代理類
package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;//JDK動態代理代理類 public class CarHandler implements InvocationHandler{ //真實類的物件 private Object car; //構造方法賦值給真實的類 public CarHandler(Object obj){ this.car = obj; }//代理類執行方法時,呼叫的是這個方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); Object res = method.invoke(car, args); System.out.println("after"); return res; } }
main方法
package proxy;import java.lang.reflect.Proxy;public class main { public static void main(String[] args) { CarImpl carImpl = new CarImpl(); CarHandler carHandler = new CarHandler(carImpl); Car proxy = (Car)Proxy.newProxyInstance( main.class.getClassLoader(), //第一個引數,獲取ClassLoader carImpl.getClass().getInterfaces(), //第二個引數,獲取被代理類的介面 carHandler);//第三個引數,一個InvocationHandler物件,表示的是當我這個動態代理物件在呼叫方法的時候,會關聯到哪一個InvocationHandler物件上 proxy.run(); } }
執行結果
before car running after
透過上面的例子三個引數我們可以看到,JDK的動態代理依靠介面實現,入參必須有被代理類的介面,也就是
carImpl.getClass().getInterfaces()
,如果有些類並沒有實現介面,則不能使用JDK代理,這就要使用cglib動態代理了。
二.Cglib動態代理
沒有實現介面的Car
package proxy;public class CarNoInterface { public void run() { System.out.println("car running"); } }
cglib代理類
package proxy;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor{ private Object car; /** * 建立代理物件 * * @param target * @return */ public Object getInstance(Object object) { this.car = object; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.car.getClass()); // 回撥方法 enhancer.setCallback(this); // 建立代理物件 return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable { System.out.println("事物開始"); proxy.invokeSuper(obj, args); System.out.println("事物結束"); return null; } }
main方法
package proxy;import java.lang.reflect.Proxy;public class main { public static void main(String[] args) { CglibProxy cglibProxy = new CglibProxy(); CarNoInterface carNoInterface = (CarNoInterface)cglibProxy.getInstance(new CarNoInterface()); carNoInterface.run(); } }
結果輸出
事物開始 car running 事物結束
上面兩個例子我們已經看到這兩種動態代理各自的分工了,在實際開發中,可以根據需求來靈活安排使用介面來代理還是類來代理了。
作者:激情的狼王
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2730/viewspace-2809662/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cglib動態代理和jdk動態代理的區別與應用CGLibJDK
- JDK 和 CGLib 實現動態代理和區別JDKCGLib
- Jdk代理和CGLIB代理的區別JDKCGLib
- JDK動態代理和CGLib代理JDKCGLib
- JDK動態代理和 CGLIB 代理JDKCGLib
- Java動態代理(JDK和cglib)JavaJDKCGLib
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- spring aop原理 JDK動態代理和CGLIB動態代理SpringJDKCGLib
- 靜態代理和動態代理(jdk/cglib)詳解JDKCGLib
- 你必須會的 JDK 動態代理和 CGLIB 動態代理JDKCGLib
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- 代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理模式JDKCGLib
- SpringAOP中JDK和CGLib動態代理哪個更快?SpringJDKCGLib
- Java JDK Proxy和CGLib動態代理示例講解JavaJDKCGLib
- 動態代理jdk的Proxy與spring的CGlibJDKSpringCGLib
- Java提高班(六)反射和動態代理(JDK Proxy和Cglib)Java反射JDKCGLib
- 面試造火箭系列,栽在了cglib和jdk動態代理面試CGLibJDK
- Spring動態代理的生成-如何判斷是使用JDK動態代理還是CGlib代理SpringJDKCGLib
- Jmh測試JDK,CGLIB,JAVASSIST動態代理方式的效能JDKCGLibJava
- Spring原始碼剖析5:JDK和cglib動態代理原理詳解Spring原始碼JDKCGLib
- CGLib 動態代理CGLib
- 動態代理-cglib分析CGLib
- 3.靜態代理&動態代理&CGlibCGLib
- 《Proxy系列專題》:代理模式(靜態、JDK、CGLib)模式JDKCGLib
- 死磕Spring之AOP篇 - 初識JDK、CGLIB兩種動態代理SpringJDKCGLib
- JDK動態代理JDK
- CGLib動態代理原理及實現CGLib
- 【深度思考】聊聊CGLIB動態代理原理CGLib
- 設計模式之cglib動態代理設計模式CGLib
- jdk的動態代理和靜態代理你還寫不出來嘛???JDK
- 基於 CGLIB 庫的動態代理機制CGLib
- JDK動態代理初探JDK
- 深挖JDK動態代理(一)JDK
- JDK動態代理詳解JDK
- 由《尋秦記》說代理模式(靜態,動態,CGLib)模式CGLib
- 動態代理的兩種方式以及區別
- SSM-Spring-10:Spring中cglib動態代理SSMSpringCGLib
- 深入理解靜態代理與JDK動態代理JDK