jdk动态代理和cglib动态代理的区别及分析

代理的作用:提供代理加强对一个对象的访问

jdk动态代理的实现原理:

  1. 拿到被代理类的引用,并获取所有接口信息(反射获取)
  2. jdk proxy.newInstance生成新的类,实现接口方法
  3. 动态生成java代码,增强逻辑代码也写入
  4. 编译java代码生成class文件
  5. 加载并运行新的class

jdk动态代理调用过程:

  1. 生成代理对象的编译文件$proxy0.class
  2. 加载到内存当中 该proxy每个方法调用的其实是调用代理类的invoke方法(输出$proxy0.class可看出调用目标方法其实是调用代理类的方法)-》super.h.invoke(this,m,null)  m就是对应的method,h是代理对象
  3. 返回代理对象供调用

jdk动态代理的实现条件:

  1. 被代理类必须继承接口,因为代理类需要clazz.getinterfaces()获取方法接口信息以生成代理类
  2. 生成的代理类的方法为final,无法在被代理重写

cglib调用过程:

  1. 生成代理对象:a.代理对象会生成每个方法的代理方法  b.调用代理对象的intercept方法
  2. 调用代理对象的invokesuper方法
  3. 生成代理类的和被代理类的fastclass(根据index参数调用方法)
  4. 调用代理类的方法-》调用被代理类的方法

cglib的实现条件:可以实现任何类

jdk动态代理和cglib的区别:

 jdk动态代理cglib
实现条件实现被代理类接口继承被代理类
生成效率直接写入class文件基于asm,实现复杂,生成效率低
调用效率通过反射调用,过程多基于fastclass调用,调用速率快
spring中的配置根据是否有接口可强制使用cglib代理
实现方式InvocationHandler接口实现MethodInterceptor接口

 

静态代理和动态代理的区别:只能代理某个方法,增加方法需要修改代理类

代理模式的优点:

  1. 使类符合开闭原则(降低系统耦合度)
  2. 将被代理对象和真实对象分离

代理模式的缺点:

  1. 类数量增加
  2. 增加系统复杂度以及请求速率 

 

总结:鸡汤不知道,我只知道偷懒后的我一直很后悔。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值