标签:stack 返回值 阅读 tcl 行业应用 system 检测 time etc
一路走来,遇到好些后生来问我:AOP该如何理解?我一开始是丢个度娘给他们的。但是现在回头想想,培养新人不能这么草率,丢个度娘给他们,让他们花了大量的时间去阅读无用的文章外,一不小心还走火入魔了。所以现在我正儿八经的写了个手稿,以便做以后的相关问题回答。文章有些瑕疵,请咬文嚼字的大牛们忽略,本文目的在于解释AOP到底有个锤子用。
上安利。。。说错,是案例:在一个夜黑风高的晚上,张三胖突然接到张大胖的电话,说咱们的视频网站响应延时太长了。你想办法监测一下是哪里的代码导致延时巨大~~~。
张三胖打开代码,关键代码主要在张五胖写的Video类里面:
public interface IVideo { List get(); Object getInfo(); }
public class JapanVideo implements IVideo { @Override public List get() { try { Thread.sleep(1024); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("一大堆正规的小视频列表~~~~~"); return null; } @Override public Object getInfo() { try { Thread.sleep(3221); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("导演:XXX;主演:苍老师~~~~~"); return null; } }
调用方:
IVideo video = new JapanVideo(); video.get(); video.getInfo();
张三胖不想去修改张五胖的代码。所以张三胖就考虑在每个方法执行前后增加时间计算。如果类里面的方法不多,这样是可以的。但是如果Video有上百个方法,那怎么搞?这时候AOP就来搞事情了。
public class AOPHandle implements InvocationHandler { private Object obj; public AOPHandle(Object obj){ this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法返回值 System.out.println("开始执行:"+System.currentTimeMillis()); //反射调用方法 Object ret=method.invoke(obj, args); //声明结束 System.out.println("开始完毕:"+System.currentTimeMillis()); //返回反射调用方法的返回值 return ret; } }
原调用方修改为:
AOPHandle aopHandle = new AOPHandle(new JapanVideo()); IVideo video = (IVideo) Proxy.newProxyInstance( JapanVideo.class.getClassLoader(), new Class[] { IVideo.class }, aopHandle); video.get(); System.out.println("\n"); video.getInfo();
这样就能检测到每个方法的消耗的时间了。
这只是一个小例子,其实AOP能做的不仅仅是这些。如:
标签:stack 返回值 阅读 tcl 行业应用 system 检测 time etc
原文地址:https://www.cnblogs.com/liu-q/p/11106247.html