AOP中调用和执行之间的区别

我试图尽可能简单地理解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"); } } 

如果我们再次查看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()); 

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

 public pointcut hello(): execution(static void HelloWorldSayer.sayHello()); 

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