AspectJ 建议已定义但未应用

AspectJ Advice Defined but not applied

所有,我试图找到解决这个问题的方法,但不知何故它让我感到困惑。我在实验基础上尝试检测 H2 驱动程序以打印出一些痕迹。方面如下:

pointcut getMajorVersion_pointcut() :
    call(int org.h2.Driver.getMajorVersion());

before() : getMajorVersion_pointcut() {
    System.out.println("Before Advice:: driver executed");
}

这非常有效,我得到了输出 "Before Advice:: driver executed"。

但是,其他的建议是有问题的:

pointcut accept_pointcut(String url) :
    call(boolean org.h2.Driver.acceptsURL(String)) && args(url);

before(String url) : accept_pointcut(url) {
    System.out.println(url);
}

Eclipse 正在标记 "Advice defined in ... has not been applied"

截图如下:

从左侧面板可以看出,H2驱动有带签名的方法。谁能指出我正确的方向。

调用Driver.acceptsURL(String)的代码在哪里?它必须在您编织的(应用程序)代码中的某个位置。如果调用是从 H2 库内部进行的,它不会被拦截,因为它在 AspectJ 的控制之外进行编码。如果你想改变这种情况,你需要

  • 将库放在 inpath 上并编织 H2 classes,创建库的编织版本并在运行时使用它而不是原始版本,
  • 或使用加载时编织 (LTW) 并在 class 加载期间动态编织 H2 库。