动态代理实现方法耗时统计:
网上查了些资料和看别人的例子, 自己写了个demo跑了下.
1.传统方法:
假设有1个类A, 有一个方法play(); 如果用传统的方法统计play()耗时, 一般会这样做:
public static void main(String[] args) {
A a = new A();
long start = System.currentTimeMillis();
a.play();
long end = System.currentTimeMillis();
System.out.println("A.play()耗时"+(end-start) + "ms.");
}
如果有很多类的很多方法都需要统计耗时, 每个方法调用前后都要加上相同的代码, 会死人的!!!!!!!!
2.使用动态代理:
需要4个对象.
Play (接口):
public interface Play {
public void play();
}
A(目标类, 必须实现Play接口):
public class A implements Play{
@Override
public void play(){
System.out.println("This is A.play()!!!");
}
}
TimeHandler: 代理类, 必须实现InvocationHandler接口
public class TimeHandler implements InvocationHandler {
private Object target;
public TimeHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
try {
long start = System.currentTimeMillis();
// 这步很关键, 如果必须用target, 不能使用proxy,使用proxy会抛很多异常,而且会有很多输出, 不知道为什么
obj = method.invoke(target, args);
long end = System.currentTimeMillis();
System.out.println(method.getName() + "耗时"+(end-start) + "ms.");
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
测试类Main:
public static void main(String[] args) {
Play p = new A();
InvocationHandler handler = new TimeHandler(p);
Play proxy = (Play)Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
handler);
proxy.play();
}
搞定, 收工!!!