使用动态代理统计方法耗时

传统方式:

public static void main(String[] args) {
    IPlay iPlay = new PlayImpl();
    long startMils = System.currentTimeMillis();
    iPlay.play();
    long endMils = System.currentTimeMillis();
    System.out.println("耗时:" + (endMils - startMils) + "ms");
}

但是问题来了,如果项目中有很多方法都需要统计耗时,怎么办?挨个写吗?那恐怕要写死过去。

看看使用动态代理该怎么做,动态代理的优势是实现无侵入式的代码扩展,也就是方法的增强;让你可以在不用修改源码的情况下,增强一些方法;在方法的前后你可以做你任何想做的事情(甚至不去执行这个方法就可以)。

步骤1:定义接口

public interface IPlay {
    void play();
}

2:目标类,必须实现上一步实现的接口

public class PlayImpl implements IPlay {

    @Override
    public void play() {
        System.out.println("This is method play run...");
    }
}

3:代理类,实现InvocationHandler

public class TimeHandler implements InvocationHandler {
    private Object target;

    public TimeHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object object = method.invoke(target, objects);
        long endTime = System.currentTimeMillis();
        System.out.println(method.getName() + " 耗时:" + (endTime - startTime) + "ms");
        return object;
    }
}

4:测试类

public class Main {
    public static void main(String[] args) {
        IPlay iPlay = new PlayImpl();
        InvocationHandler handler = new TimeHandler(iPlay);
        IPlay proxy = (IPlay) Proxy.newProxyInstance(iPlay.getClass().getClassLoader(),
                iPlay.getClass().getInterfaces(),
                handler);
        proxy.play();
    }
}
posted @ 2020-08-03 17:26  zero_7  阅读(250)  评论(0编辑  收藏  举报