AOP中调用和执行的区别

Aks*_*hah 3 java aop aspectj

我试图尽可能简单地理解 AOP 中执行和调用之间的区别。据我所知, execution() 将在执行代码中添加一个连接点,因此HelloWorldSayer.sayHello()在这种情况下,但如果切入点是call(),则连接点将是HelloWorldSayer.main()。这样对吗?

public class HelloWorldSayer {
    public static void main (String[] args) {
        sayHello();
    }

    public static void sayHello() {
        System.out.println("Hello");
    }
}

public aspect World {
    public hello():
        execution(static void HelloWorldSayer.sayHello());

    after() hello() {
        System.out.println("Bye");
    }
}
Run Code Online (Sandbox Code Playgroud)

Hak*_*kan 5

如果我们再看这个HelloWorldSayer类,有 4 个连接点阴影(2 个执行切入点和 2 个调用切入点)。

换言之,public static void main (String[] args)并且public static void sayHello()指的是执行切入点。(HelloWorldSayer.)sayHello();System.out.println("Hello");参考调用切入点。

如果按如下方式更改声明的切入点,则切入点选择 sayHello();

public pointcut hello():
    call(static void HelloWorldSayer.sayHello());
Run Code Online (Sandbox Code Playgroud)

另一方面,您按如下方式更改声明的切入点,切入点选择 sayHello 方法声明public static void sayHello()

public pointcut hello():
    execution(static void HelloWorldSayer.sayHello());
Run Code Online (Sandbox Code Playgroud)

最后,请阅读此答案以更好地了解call()execution()https : //stackoverflow.com/a/18149106/904745