asepctj有5种类型的advice
- before( Formals )
- after( Formals ) returning [ ( Formal ) ]
- after( Formals ) throwing [ ( Formal ) ]
- after( Formals )
- Type around( Formals )
关于 前四种不想做过多的解释。before已经在我们之前的的Demo中用了无数次了,剩下的3个,我给一个基本的语法就可以了,用起来和before一样。
aspect A {
pointcut publicCall(): call(public Object *(..));
after() returning (Object o): publicCall() {
System.out.println("Returned normally with " + o);
}
after() throwing (Exception e): publicCall() {
System.out.println("Threw an exception: " + e);
}
after(): publicCall(){
System.out.println("Returned or threw an Exception");
}
}
如果不太清楚的同学,可以自己把我们之前的Demo改进,看看结果便清楚。接下来,我们重点讲讲around通知:
package com.aspectj.demo.aspect;
import com.aspectj.demo.test.HelloAspectDemo;
public aspect HelloAspect {
pointcut HelloWorldPointCut(int x) : execution(* main(int)) && !within(HelloAspectDemo) && args(x);
int around(int x) : HelloWorldPointCut(x){
System.out.println("Entering : " + thisJoinPoint.getSourceLocation());
int newValue = proceed(x*3);
return newValue;
}
}
package com.aspectj.demo.test;
public class HelloWorld {
public static int main(int i){
System.out.println("in the main method i = " + i);
return i;
}
/**
* @param args
*/
public static void main(String[] args) {
main(5);
}
}
最主要的就是 proceed()这个方法~ 重要的还是自己感觉一下吧。