JDK动态代理与CGLIB动态代理

jdk动态代理

1、必须实现 InvocationHandler 接口
2、使用 Proxy.newProxyInstance 产生代理对象
3、被代理的对象必须要实现接口

用 Proxy.newProxyInstance 产生代理对象利用参数被代理对象的类加载器和被代理对象实现的所有接口生成指定的代理类—>获取代理类的构造函数对象---->根据代理类的构造函数对象来创建需要返回的代理类对象
返回值:$Proxy0(代理对象):App类运行时,JDK动态构建出来的代理类,继承至Proxy类

InvocationHandler 的 invoke()
使用invoke方法对被代理人的方法进行拦截, 为真实对象定制代理逻辑
*
第一个参数为 代理对象
*
第二个参数为目标类的真实方法
*
第三个参数为目标方法参数

后面两个参数决定调用被代理类的哪个方法

CGlib动态代理

CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑
在底层实现上,CGLIB 使用字节码处理框架 ASM,该框架用于转换字节码并生成新的类

区别

JDK 动态代理只能对接口进行代理,不能对普通的类进行代理,这是因为 JDK 动态代理生成的代理类,其父类是 Proxy,且 Java 不支持类的多继承。
CGLIB 能够代理接口和普通的类,但是被代理的类不能被 final 修饰,且接口中的方法不能使用 final 修饰。
JDK 动态代理使用 Java 反射技术进行操作,在生成类上更高效。
CGLIB 使用 ASM 框架直接对字节码进行修改,使用了 FastClass 的特性。在某些情况下,类的方法执行会比较高效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值