aspectj – 执行调用联接点

前端之家收集整理的这篇文章主要介绍了aspectj – 执行调用联接点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个不同的方面类来计算执行测试程序的非静态方法调用次数.第一个方面计算“呼叫”连接点的方法
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代码控制之外的地方.

通常,在所有情况下,原因是整体使用代码与编织代码子集之间的区别.换句话说:代码在你之外(或方面)的控制之间的区别.

原文链接:https://www.f2er.com/java/122622.html

猜你在找的Java相关文章