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

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

JDK

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

Cglib

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值