java动态代理

Posted by alonealice on 2017-05-11

代理的概念

首先,什么是代理?
当我们不能或者不希望直接访问对象A,而是通过对象B去访问对象A,这种方式就叫做代理。而对象A的类就被称为委托类,对象B的类就被称为代理类。
这样做有什么好处呢?第一,委托类被完全隐藏起来,其他类无法直接访问委托类;第二,在访问委托类之前,可以在代理类中做一些公共的操作,比如一些判断,可以帮助程序更好的解耦。
代理可以分为静态代理和动态代理。

静态代理

什么是静态代理?顾名思义,所有的委托类和代理类在编译前都已经写好或者通过编译器生成好。一般情况下,代理类和委托类都会继承同一个接口。

动态代理

动态代理指的就是代理类在程序运行前并不存在,在程序运行过程中动态生成代理方法的方式。这样做的好处是可以对代理类的所有方法做统一处理,而不用对每个方法单一处理。

动态代理的实现

第一步,实现委托类。

1
2
3
4
5
6
public class OperateImpl implements Operate {
@Override
public void operateMethod() {
Log.d("代理实现","代理实现");
}
}

这个类继承继承自Operate,并且实现了方法operateMethod。
第二步,生成代理对象。

1
2
3
4
5
6
7
8
9
10
final OperateImpl operateImpl=new OperateImpl();
Operate operate= (Operate) Proxy.newProxyInstance(OperateImpl.class.getClassLoader(), new Class[]{Operate.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(operateImpl, args);
}
});

operate.operateMethod();

Proxy.newProxyInstance(…)新建了一个代理对象,并动态生成代理类。我们在调用代理对象的方法时就会调用到invoke方法。在newProxyInstance方法中需要3个参数,第一个是委托类的类构造器,第二个是委托类的接口,最后是InvocationHandler对象。
那么InvocationHandler又是什么呢?
每一个动态代理类都必须要实现InvocationHandler接口,并且每个代理类的实例都关联一个handler,当我们通过代理类调用方法时,这个方法都会被转化为在InvocationHandlerinvoke方法中调用。invoke方法有3个参数,第一个表示该代理对象的实例,第二个表示调用的方法,第三个表示该方法的传入参数。在invoke方法中,我们就可以统一的对方法做相应的判断处理。