Does it mean “get all join points that are in P, then add all join
points that are in Q, then match on anything that flows from any of
them”?
不,这意味着获得P和Q中的所有连接点,因此它是交叉点.
Or does it mean “get all join points in P that are also in Q”, i.e.
all flow points within X() below?
是的,“获得P中的所有连接点也在Q中”,其余部分则为“否”.原因是切入点P定义了一个连接点:execution(void Example.P()),而切入点Q定义了一个连接点:execution(void Example.Q()).因为这些连接点不同,所以它们的交集是空集.从空集中获取的cflow也是一个空集.这就是为什么在AspectJ文档中,这个切入点标记为“不应该发生”.
希望这可以帮助!
这是Power Point演示文稿中的一个误导性引用:
cflow(P && Q) means that you first combine the pointcuts P and Q, and
all the join points flowing from that are in this collection
“combine”一词应改为“intersect”.
public class Example {
public void P() {
Q();
}
public void Q() {
}
public static void main(String[] args) {
new Example().P();
}
}
如果你运行它,输出应该是这样的:
pointcut: P join point: execution(Example.P())
pointcut: flowP join point: execution(Example.P())
pointcut: flowP join point: call(Example.Q())
pointcut: Q join point: execution(Example.Q())
pointcut: flowP join point: execution(Example.Q())
pointcut: flowQ join point: execution(Example.Q())
pointcut: flowPAndflowQ join point: execution(Example.Q())
这表明只有3个连接点:
A: execution(Example.P())
B: call(Example.Q())
C: execution(Example.Q())
切入点:
pointcut P includes only A
pointcut Q includes only C
pointcut flowP includes A, B and C
pointcut flowQ includes only C
pointcut flowPAndflowQ includes only C
我们现在可以看到P&& flow是一个空集,而flowP&& flowQ包括C.
我还包括了额外的切入点:cflow(P()&& publicMethods())(这个切入点的建议在代码中被注释掉了). publicMethods()是执行(public * *(..)).与cflow(P()&& Q())不同,它不会导致空集.