Java动态代理
什么是代理
{% raw %} 大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。这个就好比 商户---->明星经纪人(代理)---->明星这种模式。我们可以不通过直接与明星对话的情况下,而通过明星经纪人(代理)与其产生间接对话。
再举个例子我想点份外卖,但是手机没电了,于是我让同学用他手机帮我点外卖。在这个过程中,其实就是我同学(代理对象)帮我(被代理的对象)代理了点外卖(被代理的行为),在这个过程中,同学可以完全控制点外卖的店铺、使用的APP,甚至把外卖直接吃了都行(对行为的完全控制),由此,可以简单的总结代理有四个要素
-
代理对象
-
被代理的行为
-
被代理的对象
-
行为的完全控制
静态代理
说到代理我们肯定要先说静态代理,那么我们就要知道静态代理是什么,下面我通过一个案例来进行解释。
假如说我们遇到了这样一个需求,需要记录一些方法的执行时间,最简单的办法就是在方法开头和结尾各加一个时间戳:
public static void execute(int x, int y) {
tools.info("start:{%tT}", System.currentTimeMillis());
if (x == 3) {
tools.info("end:{%tT}", System.currentTimeMillis());
return;
}
for (int i=x; i < y; i++) {
if (i == 5) {
tools.info("end:{%tT}", System.currentTimeMillis());
return;
}
}
tools.info("end:{}", System.nanoTime());
return;
}
我们需要在每个return前面都加个记录时间戳的代码,很麻烦,于是我们可以由方法的调用者来记录时间:
public class Invoker {
private Executor executor = new Executor();
public void invoke() {
log.info("start:{}", System.nanoTime());
executor.execute(1, 2);
log.info("end:{}", System.nanoTime());
}
}
这样就会有一个新的问题,
{% endraw %}