加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

aspectj – 执行调用联接点

发布时间:2020-12-14 05:25:39 所属栏目:Java 来源:网络整理
导读:我有两个不同的方面类来计算执行测试程序的非静态方法调用的次数.第一个方面计算“呼叫”连接点的方法: pointcut methodCalls() : call (!static * test..*(..));before(): methodCalls() { counter.methodCallCounter();} 而第二个方面计算“执行”连接点
我有两个不同的方面类来计算执行测试程序的非静态方法调用的次数.第一个方面计算“呼叫”连接点的方法:
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代码控制之外的地方.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读