修改HelloWorld.java文件
package aspectj;
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("main");
main(5);
}
public static void main(int i)
{
System.out.println("i="+i);
}
}
運(yùn)行代碼:
輸出
Hello world!
main
Hello world!
i=5
可以看到這兩個(gè)main方法都被攔截了
從這兩個(gè)箭頭也能看出來
image.png
如果現(xiàn)在只想要攔截參數(shù)是int類型的main函數(shù),該怎么做呢腻扇?
修改HelloAspect.aj
package aspectj;
public aspect HelloAspect {
pointcut HelloWorldPointCut() : execution(* aspectj.HelloWorld.main(int));
before() : HelloWorldPointCut() {
System.out.println("Hello world!");
}
}
輸出結(jié)果:
main
Hello world!
i=5
箭頭也只剩下面的了
image.png
args:使用“args(參數(shù)類型列表)”匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)為指定類型的執(zhí)行方法债热;注意是匹配傳入的參數(shù)類型,不是匹配方法簽名的參數(shù)類型幼苛;參數(shù)類型列表中的參數(shù)必須是類型全限定名窒篱,通配符不支持;args屬于動態(tài)切入點(diǎn)舶沿,這種切入點(diǎn)開銷非常大墙杯,非特殊情況最好不要使用;
出處:https://www.cnblogs.com/caoyc/p/5629507.html
如果需要獲取傳入main(int i)這個(gè)函數(shù)的參數(shù)值:
package aspectj;
public aspect HelloAspect {
pointcut HelloWorldPointCut(int i) : execution(* aspectj.HelloWorld.main(int))&&args(i);
before(int x) : HelloWorldPointCut(x) {
x+=10;
System.out.println("Hello world! x="+x);
}
}
打印結(jié)果:
main
Hello world! x=15
i=5