JDK动态代理和Cglib动态代理的区别

这两个动态代理都是在程序运行期间动态修改字节码,然后通过反射创建出代理对象

JDK

JDK动态代理是基于接口实现的,也就是说,只有实现了接口的类,才能被JDK进行动态代理。
JDK会通过一个工厂类,生成代理类的二进制字节码流,这个代理类呢,是Proxy的子类,并且实现了被代理类中实现的所有接口,同时实现了接口中的所有方法,这些方法的实现很简单,直接调用了回调函数,也就是InvocationHandler接口中的invoke方法。在invoke方法里,就可以完成方法的增强,以及可以通过反射调用方法。

Cglib

Cglib是基于继承实现的,也就是说,代理类其实就是被代理类的子类。所以被代理类如果被final修饰的话,是无法使用Cglib进行代理的。
Cglib动态代理是字节码操作,它是在程序运行时,使用asm字节码框架,获取到被代理类的字节码,然后进行修改,最后生成子类。这个子类就作为代理类,它里面就重写了被代理类的方法,在方法实现上直接执行回调函数,也就是MethodInterceptor的intercept方法。(所以被final修饰的方法也就是无法被代理的)在回调函数里面可以完成方法增强以及方法调用,从而完成一次代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章