执行比呼叫加入点

时间:2013-08-08 17:58:03

标签: aspectj

我有两个不同的方面类来计算执行测试程序的非静态方法调用的数量。第一个方面计算“呼叫”连接点的方法:

pointcut methodCalls() : call (!static * test..*(..));
before(): methodCalls() {
        counter.methodCallCounter();
}

而第二个方面计算“执行”连接点的方法:

pointcut methodCalls() : execution (!static * test..*(..));
before(): methodCalls() {
        counter.methodCallCounter();
}

methodCallCounter()是计数器类中的静态方法。

小测试程序的方法调用次数是相同的。但是当我用更大的程序更改测试程序时,第二个方面类中的方法调用数(带执行切入点)大于带有调用切入点的方面类中的方法调用数。这是合理的,因为调用连接点不会选择使用super进行的调用,因此不会对它们进行计数。

但是,我遇到了一种情况,对于程序的特定执行,方面类中使用“call pointcut”的非静态方法调用的数量高于具有“执行切入点”的方面类中的方法调用数。我找不到任何解释为什么会发生这种情况。任何想到第二种情况的原因都值得赞赏。

2 个答案:

答案 0 :(得分:39)

如果您理解call()execution()切入点之间的基本区别,那么解释非常简单:前者拦截所有调用者(即方法调用的来源),后者拦截调用本身无论他们来自哪里。

那么两个切入点触发的拦截次数怎么会有所不同呢?

  • 如果从您自己的代码中调用JRE / JDK方法,则AspectJ可以编入您的调用,但不能编入JDK中的执行连接点(除非您已创建编织JDK作为准备步骤)。因此,呼叫次数将高于执行次数。
  • 同样,如果您调用第三方库中没有与AspectJ编织的方法,因为它们在LTW或CTW期间不在路径中,则不会再捕获执行。
  • 最后,但并非最不重要的是,如果您自己的编织代码由第三方库或JRE / JDK类调用,则可能会发生相反的情况。在这种情况下,计算的执行次数将高于调用次数,因为它们来自AspectJ代码控制之外的位置。

通常,在所有情况下,原因是总体使用的代码与编织代码的子集之间的差异。换句话说:您(或方面')控件之下和之外的代码之间的差异。

答案 1 :(得分:2)

嘿,这张图可能会帮助你想象执行和调用之间的区别: enter image description here