Skip to content

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 %}

Comments