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动态代理和cglib动态代理的区别及分析_第1张图片

jdk动态代理和cglib动态代理的区别及分析_第2张图片

jdk动态代理的实现条件:

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

cglib调用过程:

  1. 生成代理对象:a.代理对象会生成每个方法的代理方法  b.调用代理对象的intercept方法jdk动态代理和cglib动态代理的区别及分析_第3张图片
  2. 调用代理对象的invokesuper方法
  3. 生成代理类的和被代理类的fastclass(根据index参数调用方法)
  4. 调用代理类的方法-》调用被代理类的方法

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

jdk动态代理和cglib的区别:

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

 

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

代理模式的优点:

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

代理模式的缺点:

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

 

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

 

 

 

你可能感兴趣的:(java)