我目前正在阅读 AspectJ 的文档,但我不太明白他们对 Pointcut composition 的看法。特别是,我不明白 cFlow(P && Q)
的作用,当带有该切入点的建议将被执行时。
我发现的一个 PowerPoint presentation(用于乌得勒支大学的类(class))解释了
他们继续列出 cFlow(P) && cFlow(Q)
( pointcut flowPAndflowQ() : cflow(execution(* Example.P(..))) && cflow(execution(* Example.Q(..))) && within(Example);
) 的所有连接点,对我来说,它看起来像是单个语句的所有控制流点的 intersection - P∩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 的例子所说的那样? (为什么?)
如果有人能给我一些启示,我真的很感激。 :)
最佳答案
不,这意味着获取 P 和 Q 中的所有连接点,因此它是交集。
是的“获取 P 中所有也在 Q 中的连接点”,其余部分则否。原因是切入点P定义了一个连接点:execution(void Example.P()),切入点Q定义了一个连接点:execution(void Example.Q())。因为这些连接点不同,它们的交集是一个空集。取自空集的 cflow 也是空集。这就是为什么在 AspectJ 文档中这个切入点被标记为“不应该发生”。
希望这可以帮助!
这是来自 Power Point 演示文稿的误导性引用:
“组合”一词应替换为“相交”。
我在 Github 上创建了一个简单的示例,它复制了 PowerPoint 演示文稿中的示例:https://github.com/medvedev1088/aspectj-cflow-composition-example
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 && Q 是一个空集,而 flowP && flowQ 包括 C。
我还包括了额外的切入点:cflow(P() && publicMethods())(这个切入点的建议在代码中被注释掉了)。 publicMethods() 是执行(public * *(..))。与 cflow(P() && Q()) 不同,它不会导致空集。
关于java - 你能举例说明 AspectJ 的 cFlow(P && Q) 是做什么的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30039559/