3、传递参数(args也是一个pointcut)

修改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

你可能感兴趣的:(3、传递参数(args也是一个pointcut))