代理的概念
首先,什么是代理?
当我们不能或者不希望直接访问对象A,而是通过对象B去访问对象A,这种方式就叫做代理。而对象A的类就被称为委托类,对象B的类就被称为代理类。
这样做有什么好处呢?第一,委托类被完全隐藏起来,其他类无法直接访问委托类;第二,在访问委托类之前,可以在代理类中做一些公共的操作,比如一些判断,可以帮助程序更好的解耦。
代理可以分为静态代理和动态代理。
静态代理
什么是静态代理?顾名思义,所有的委托类和代理类在编译前都已经写好或者通过编译器生成好。一般情况下,代理类和委托类都会继承同一个接口。
动态代理
动态代理指的就是代理类在程序运行前并不存在,在程序运行过程中动态生成代理方法的方式。这样做的好处是可以对代理类的所有方法做统一处理,而不用对每个方法单一处理。
动态代理的实现
第一步,实现委托类。
1 | public class OperateImpl implements Operate { |
这个类继承继承自Operate,并且实现了方法operateMethod。
第二步,生成代理对象。
1 | final OperateImpl operateImpl=new OperateImpl(); |
Proxy.newProxyInstance(…)
新建了一个代理对象,并动态生成代理类。我们在调用代理对象的方法时就会调用到invoke
方法。在newProxyInstance
方法中需要3个参数,第一个是委托类的类构造器,第二个是委托类的接口,最后是InvocationHandler
对象。
那么InvocationHandler
又是什么呢?
每一个动态代理类都必须要实现InvocationHandler
接口,并且每个代理类的实例都关联一个handler,当我们通过代理类调用方法时,这个方法都会被转化为在InvocationHandler
的invoke
方法中调用。invoke
方法有3个参数,第一个表示该代理对象的实例,第二个表示调用的方法,第三个表示该方法的传入参数。在invoke
方法中,我们就可以统一的对方法做相应的判断处理。