基于接口的动态代理

Posted by 好记性不如烂笔头 on 04-05,2020

为啥要用代理编程?

使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情。公共的业务由代理来完成。公共业务扩展时变得集中和方便。

比如Service的每个方法都要记录日志,这个记录日志的功能就可以交给代理来完成,不需要在每个方法里都写上记录日志那一段代码。

代理可以使得在不改变源码的情况下,对原有方法进行增强,这也是AOP(面向切面编程的基础),用来弥补面向对象的不足。

动态代理

  • 作用:在不修改源码的基础上对方法增强
  • 要求:被代理的类至少实现一个接口,否则不能使用该代理
  • 如何创建代理类:使用Proxy类的静态方法newProxyInstance

newProxyInstance方法

该方法用于创建代理类,有3个参数。

  • 方法参数:
    1. ClassLoader:类加载器,传入和被代理对象使用相同的类加载器,固定写法。
    2. Class[]:字节码数组,用于让代理对象和被代理对象有相同的方法,固定写法。
    3. InvocationHandler:调用处理器,是一个接口类型,用于提供增强的代码,执行被代理对象的任何接口方法都会经过这个方法,通常情况下传入一个匿名类,这个参数不是必须的。

InvocationHandler接口只有一个待实现的方法:invoke。

invoke方法

  1. Object proxy:代理对象的引用
  2. Method method:当前执行的方法
  3. Object[] args:当前执行的方法所需的参数
  4. 该方法的返回值和被代理对象的方法返回值相同。