当前位置: 首页 > 知识库问答 >
问题:

执行与调用连接点

何越
2023-03-14

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

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

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

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

是一个静态方法在计数器类。

小测试程序的方法调用次数相同。但是当我用一个更大的程序改变测试程序时,第二个方面类(带有执行切入点)中的方法调用数量比带有调用切入点的方面类中的方法调用数量多。这是合理的,因为呼叫连接点不会挑出用超级发出的呼叫,因此不会计算它们。

然而,我遇到了这样一种情况:对于程序的特定执行,具有“调用切入点”的方面类中的非静态方法调用数高于具有“执行切入点”的方面类中的方法调用数。我找不到任何解释为什么会发生这种情况。请考虑第二种情况的原因。

共有1个答案

卢朝
2023-03-14

实际上,如果你理解call()执行()切入点之间的基本区别,解释是非常简单的:前者拦截所有调用者(即方法调用的来源),后者拦截调用本身,无论它们在哪里起源于。

那么,两个切入点触发的拦截数量有什么不同呢?

  • 如果您从自己的代码中调用JRE/JDK方法,AspectJ可以编织到您的调用中,但不能编织到JDK中的执行连接点中(除非您已经创建了编织JDK作为准备步骤)。因此,调用的数量将高于执行的数量。

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

 类似资料:
  • 我还是nodejs的新手,有些东西不能理解。我有带有代码的db.js文件: 当我尝试这样插入行时: 它会失败,并出现sql语法错误。为什么它失败了,它工作得很好,只是使用了稍微不同的db.js。我在这里寻找简短而正确的解决方案。

  • 我设法对接了我们的旧应用程序和更新的应用程序,但现在我需要通过API调用使它们彼此。 项目: project1=使用(桥驱动程序) project2=使用(桥驱动程序) project3=使用(桥驱动程序) null 我一直在查看,但显然不推荐使用它,或者不推荐使用它 尝试了从project1容器到project2容器的操作:

  • 有人能告诉我在maven中scm连接和developerConnection之间的区别吗? 我正在尝试使用,它需要其中之一。 [错误]未能执行goal org . Apache . maven . plugins:maven-release-plugin:2 . 3 . 2:在项目was-topology-legacy-dsl上准备(default-cli ):缺少必需的设置:必须指定scm连接或

  • 在Apache Flink流处理中,连接操作与连接有何不同,因此CoProcessFunction和ProcessJoinFunction有何不同,这是CoProcessFunction提供的onTimer函数吗?您能否提供一个适用于以相互排斥的方式连接/连接的示例用例。

  • 问题内容: 我不能用Rselenium得到任何好处。这是第一步,也是我的输出: 我错过了什么 ? 问题答案: 尝试运行不建议使用的Selenium时,有两种选择: 使用rsDriver 使用Docker 看到: 大家似乎 对发生问题rsDriver和码头工人是推荐的选项,所以我们走的这条路: 安装码头工人 运行它,按要求重新启动计算机 通过在命令行中(或代替)或在R中运行来拉取图像 通过在命令行中

  • 在我的程序中,我正在访问wep api。最多可以有7个不同的线程访问web api的不同服务器。每个线程负责一个服务器,每个服务器速率限制每个线程。每个线程更新相同的mysql数据库。线程数保持不变。 在我的示例中,是否需要连接池?我不应该只打开7个不同的连接,这些连接将在程序的生命周期中打开吗?