gpt4 book ai didi

aop - 执行力对比调用加入点

转载 作者:行者123 更新时间:2023-12-03 11:48:49 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

实际上,如果您了解 call() 之间的基本区别,那么解释就很简单了。和 execution()切入点:前者拦截所有调用者(即方法调用的来源),后者拦截调用本身,无论它们来自何处。

那么这两个切入点触发的拦截次数是如何不同的呢?

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

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

    关于aop - 执行力对比调用加入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132822/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com