修改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);
}
}
运行代码:
输出
Hello world!
main
Hello world!
i=5
可以看到这两个main方法都被拦截了
从这两个箭头也能看出来
image.png
如果现在只想要拦截参数是int类型的main函数,该怎么做呢?
修改HelloAspect.aj
package aspectj;
public aspect HelloAspect {
pointcut HelloWorldPointCut() : execution(* aspectj.HelloWorld.main(int));
before() : HelloWorldPointCut() {
System.out.println("Hello world!");
}
}
输出结果:
main
Hello world!
i=5
箭头也只剩下面的了
image.png
args:使用“args(参数类型列表)”匹配当前执行的方法传入的参数为指定类型的执行方法;注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用;
出处:https://www.cnblogs.com/caoyc/p/5629507.html
如果需要获取传入main(int i)这个函数的参数值:
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);
}
}
打印结果:
main
Hello world! x=15
i=5