使用动态代理统计方法耗时
传统方式:
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();
}
}