原方法(没有返回值)
public void exe(){
//Do something
}
被改造后
import org.nutz.aop.InterceptorChain;
....
public void exe(){
try{
new InterceptorChain(XX,XXX...).doChain();
}catch (Throwable) {
throw e;
}
}
其中使用到的InterceptorChain,可以理解为Servlet里面的FilterChain,它携带着执行原方法时可以获取的信息,如调用对象.调用方法,参数,返回值等整个 InterceptorChain 不到100行,我相信你很快就能看完.懒人的话,只看doChain()/invoke(),你将会豁然开朗.
整体思路
如果在你的方法中打印堆栈,你将看到类似的信息
java.lang.Throwable at org.nutz.aop.asm.test.Aop1.mixArgsVoid(Aop1.java:55) at org.nutz.aop.asm.test.Aop1$$NUTZAOP._aop_invoke(Unknown Source) // 这是被aop化的标志 at org.nutz.aop.InterceptorChain.invoke(InterceptorChain.java:51) at org.nutz.aop.InterceptorChain.doChain(InterceptorChain.java:39) at org.nutz.aop.interceptor.LoggingMethodInterceptor.filter(LoggingMethodInterceptor.java:29) //拦截器B at org.nutz.aop.InterceptorChain.doChain(InterceptorChain.java:42) at org.nutz.aop.AbstractMethodInterceptor.filter(AbstractMethodInterceptor.java:10) //拦截器A at org.nutz.aop.InterceptorChain.doChain(InterceptorChain.java:42) at org.nutz.aop.asm.test.Aop1$$NUTZAOP.mixArgsVoid(Unknown Source)
mixArgsVoid 就是你原本方法