Java代理模式

86 阅读2分钟

Java代理模式

静态代理

  1. 需要手动实现被代理方法的增强,每一个被代理的类都需要手动实现一个代理类。
  2. 静态代理再编译时就将接口、实现类、代理类编译成一个个class文件

动态代理

  1. 动态代理不需要为每一个目标类单独创建一个代理类,也不必须实现接口,可以直接代理实现类(CGLIB代理类)。
  2. 动态代理是再运行时动态生成字节码,并加载到JVM中的。

Jdk 动态代理

  1. 通过实现接口的方式实现
  2. 使用Proxy.newProxyInstance 来动态生成被代理接口的一个新实例, 新生成的代理对象实例的所有方法都调用给定处理器InvocationHandler 的invoke方法
  3. 使用代理生成的实例调用接口的方法时,实际是调用处理器的invoke方法。
  4. 如果接口有实现类,可以再invoke中调用接口实现类的原有方法。
  5. 这种方式代理只能代理接口或实现接口的类。

CGLIB 动态代理

  1. CGLIB动态代理通过继承的方式实现。
  2. CGLIB使用Enhancer.create() 来生成一个继承了被代理类的子类的对象, 生成的子类中 重写了代理类的所有方法,调用处理器 MethodInterceptor 的intercept 方法
  3. 使用代理生成的实例调用目标类的方法时,实际调用的是动态生成的子类的对象的方法,也即调用类intercept方法
  4. 这种方式可以代理没有实现任何接口的类。