使用动态代理统计方法耗时
传统方式:
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();
    }
} 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号