何谓动态代理呢?
先说说代理模式吧。
当调用某个代理对象方法的时候,其实它间接的去调用委托类的方法。
代理模式的作用是:
- 远程代理,就是为一个对象在不同地址空间提供局部代表,这样就可以隐藏一个对象存在不同地址空间的事实。android中的AIDL就是典型的例子。
- 虚拟代理 代理类实例化的时间比较长,如加载图片,在图片还来不及加载的时候,虚拟代理替换真实的图片
- 安全代理 控制访问代理类的权限
按照代理的创建时期,代理类可以分为两种:
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。代理对象和实际执行对象(委托类)之间是耦合的。
动态:在程序运行时运用反射机制动态创建而成
动态代理使用有两个外部显著特点:
- 借助Proxy.newProxyInstance可以生成一个代理对象,这个代理对象是根据接口动态实例化生成的,
- 实现InvocationHandler的invoke方法来拦截对上面代理对象方法调用的动作。在该方法里是执行真正工作的地方。在这个invoke里我们能够拿到 “所调用方法的详细信息”,“所传入的参数”,以及“代理对象本身的引用”。
动态代理例子:
public class DynamicProxyTest2 {
public static void main(String[] args) {
Dog realDog = new ChinaDog();
Dog proxyDog = (Dog) Proxy.newProxyInstance(Dog.class.getClassLoader(), new Class[] { Dog.class },
new MyInvocationHandler(realDog));
proxyDog.run();
}
}
interface Dog {
void run();
}
class ChinaDog implements Dog {
@Override
public void run() {
Utils.p("中华田园犬开始奔跑了===>");
}
}
class MyInvocationHandler implements InvocationHandler {
Dog realTarget;
public MyInvocationHandler(Dog target) {
this.realTarget = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ExtraWork.beforeInvokeMethod();
Object result = method.invoke(realTarget, args);
ExtraWork.afterInvokeMethod();
return result;
}
}
class ExtraWork {
public static void beforeInvokeMethod() {
Utils.p("\"奔跑\"执行前的工作");
}
public static void afterInvokeMethod() {
Utils.p("\"奔跑\"执行后的工作");
}
}