cFlow(P && Q)
的作用。我找到了一份乌得勒支大学课程的演示文稿,解释道:
cflow是从参数切入点流出的连接点集合。这意味着cflow(P)和cflow(Q)是两个集合的交集,而cflow(P&& Q)意味着您首先组合切入点P和Q,然后所有从中流出的连接点都在此集合中。
他们列出了cFlow(P) && cFlow(Q) (
pointcut flowPAndflowQ() : cflow(execution(* Example.P(..))) && cflow(execution(* Example.Q(..))) && within(Example);
)的所有连接点,对我来说,这看起来像是单个语句的所有控制流点的交集-如果您愿意,就像他们所说的那样:P ∩ Q:
从P流动 - execution(void Example.P())
从P流动 - call(void Example.Q())
从P流动 - execution(void Example.Q())
从Q流动 - execution(void Example.Q())
从P和Q流动 - execution(void Example.Q())
(他们的示例类似于AspectJ文档中的示例,只是缺少println()语句。)
我仍然不理解的是cFlow(P && Q)会做什么。
这是否意味着“获取所有在P中的连接点,然后添加所有在Q中的连接点,然后匹配任何从它们中的任何一个流出的内容”?如果是这样,我不理解AspectJ示例中的println()语句:System.out.println("should not occur");
。当然,如果我添加P和Q中的所有流点(即P + Q
),那应该是P ∩ Q的超集(并集), P ∪ Q?或者这是否意味着“获取P中所有也在Q中的连接点”,即下面X()
中的所有流点?public void P() { X(); }
public void Q() { X(); }
public void X() { /* all that is in the body of X() */ }
或者像AspectJ的示例所示,它永远不会发生?(为什么?)
如果有人能够解释一下,我会非常感激。 :)
cflow(P) && cFlow(Q)
是交集(包括两个切入点下游的连接点),而cFlow(P && Q)
也是一个交集,但与第一个不同?这是因为后者只看初始切入点,而不考虑“下游”的连接点吗?你能否构造一个示例来说明后者的工作原理呢? :) - ChristiancFlow(P && Q)
写成了pointcut cFlowPandQ : cFlow(execution(* Example.P()) && execution(* Example.Q())) && within(Example);
那么,整个重点是您无法同时执行 P 和 Q 吗? (当 P 调用 Q 时,这不是发生的情况吗?) - Christiancflow(P() && publicMethods())
之所以有效,是因为它本质上是相同连接点的不同名称(切入点)在同一时间?(pcut: P -> jn pts: execution(Example.P())
和pcut: execPublicMethods -> jn pts: execution(Example.P()), execution(Example.Q())
,所以当Example.P()
被执行时,两个切入点都会被触发 - 我不明白的是为什么我会得到以下结果:pcut: flowPAndPublic -> jn pts: execution(Example.P()), call(Example.Q()), execution(Example.P())
,对于cflow(P() && publicMethods()) && within(example.Example)
;我现在只期望第一个结果..) - Christian