/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
这个切入点,命名为服务,在服务器对象调用它们的公共方法时挑选出程序执行中的那些点。它还允许使用服务切入点的任何人访问正在调用其方法的 Server 对象。(取自https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.html)
我正在尝试理解 AspectJ 的切入点,目前有点困惑。我的主要问题是:您如何阅读上述切入点,以及如何将其含义“拼凑”在一起?
为了说明我的困惑,让我们尝试从头开始构建:
以下切入点将拦截对任何对象的所有公共方法调用,对吗?
/* 1 */ pointcut services() : call(public * *(..))
现在,这个呢:
/* 2 */ pointcut services() : call(public * Server.*(..))
我假设在调用 Server 对象的公共方法时会拦截任何点。
现在,我如何从这里到达初始示例 0?我如何阅读它?
在构建切入点时,您会先提供参数列表吗?
/* 3a */ pointcut services(Server s) : call(public * *(..))
和上面的2一样吗?(我感觉它不起作用,如果它起作用了,它会“拦截”每个公共方法调用,就像数字 1 一样。)无论如何,以下内容是否相同?(我s
还没有用原生切入点“捕获”,所以我不能真正定义它,可以吗?)
/* 4a */ pointcut services(Server /* only type, no variable */) : call(public * *(..))
或者你会从指定一个原生切入点开始,以“捕获”目标对象,如下所示:
/* 3b */ pointcut services() : target(s) && call(public * *(..))
我想这仍然会拦截任何对象上的所有公共方法调用?
下面的工作是否只能拦截对 Server 对象的调用,并“捕获”该对象(而不使其可用于稍后传递,例如传递给通知)?
/* 5 */ pointcut services(/*nothing here*/) : target(s) && call(public * Server.*(..))
现在,回到原来的切入点:
/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
是不是一样
/* 6 */ pointcut services(Server s): target(s) && call(public * Server.*(..))
所以,总结一下:你如何开始破译 0?
您是否首先查看target
切入点,然后查看切入点的参数类型services
并“从内到外”/“从右到左”阅读它?还是先看参数列表,再看services
切入点,看看参数是从哪里来的(即target(s)
)?
还是我让这太复杂了?我是否在某处遗漏了重要信息来帮助我理解这一点?
编辑:手册从左到右解释它 - 但是Server s
如果我还没有“执行”,参数的参数来自target(s)
哪里?