我有两个不同的方面类来计算执行测试程序的非静态方法调用的次数.第一个方面计算“呼叫”连接点的方法:
pointcut methodCalls() : call (!static * test..*(..)); before(): methodCalls() { counter.methodCallCounter(); }
而第二个方面计算“执行”连接点的方法:
pointcut methodCalls() : execution (!static * test..*(..)); before(): methodCalls() { counter.methodCallCounter(); }
methodCallCounter()是计数器类中的静态方法.
小测试程序的方法调用次数是一样的.但是当我用更大的程序更改测试程序时,第二个方面类(具有执行切入点)的方法调用次数多于使用调用切入点的aspect类中的方法调用次数.这是合理的,因为调用连接点不会选择使用super进行的调用,因此不会对其进行计数.
然而,我遇到一个情况,对于程序的具体执行,在“调用切入点”的aspect类中的非静态方法调用的数量高于具有“执行切入点”的aspect类中的方法调用的数量.我找不到任何解释为什么会发生这种情况.任何关于第二种情况的原因的想法是赞赏.
解决方法
如果您明白了call()和execution()切入点之间的基本区别,那么这个解释很简单:前者拦截了所有的调用者(即方法调用的源),后者拦截了调用本身,无论它们在哪里.
>如果从您自己的代码调用JRE / JDK方法,AspectJ可以编入您的调用,但不能编入JDK中的执行连接点(除非您已经创建了一个编织JDK作为准备步骤).因此,通话次数将高于执行次数.
>同样地,如果您在第三方库中调用方法,因为在LTW或CTW期间它们不在路径上,所以您无法使用AspectJ进行编织,那么再次执行不会被捕获.
>最后,但同样重要的是,如果您自己编写的代码由第三方库或JRE / JDK类调用,则可能会发生这种情况.在这种情况下,计算的执行次数将高于呼叫次数,因为它们源自AspectJ代码控制之外的地方.