2

我有一个接口rangeQuery(),我尝试使用 Spring AOP 对所有子类型进行分析。特别是,对于任何调用,rangeQuery()我想知道它distance()从其主体调用字段上的另一个方法多少次。

我知道我可以编写一个方法来计算所有对距离的调用,如下所示:

@Before("execution(* *.distance(..))") 
public void count(JoinPoint joinPoint) {
    count++
}

但是,这不会捕获rangeQuery()调用它的调用。

有任何想法吗?

4

2 回答 2

0

而不是 using @Before,您可能必须使用@Aroundthat 允许您使用ProceedingJoinPoint来获取源位置。

 @Around(" ..... ")
  public void test(ProceedingJoinPoint pjp) throws Throwable {

    SourceLocation sl = pjp.getSourceLocation();
    System.out.println(sl.getFileName());
    System.out.println(sl.getLine());
    System.out.println(sl.getWithinType());

    // allow through
    pjp.proceed();
  }

在您的情况下,听起来您可能需要callexecution但似乎call在 Spring AOP 中不受支持:-

其他切入点类型

完整的 AspectJ 切入点语言支持 Spring 中不支持的其他切入点指示符。它们是:call、initialization、preinitialization、staticinitialization、get、set、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this 和 @withincode。在 Spring AOP 解释的切入点表达式中使用这些切入点指示符将导致抛出 IllegalArgumentException。

于 2011-01-30T16:08:22.297 回答
0

作为最后的手段,在上面的@Before建议中,您可以使用Thread.currentThread.getStackTrace()并查看调​​用者是否为rangeQuery.

但是,您应该在堆栈跟踪中找到一些要查找的固定“模式”,而不仅仅是检查第 N 个位置以查看它是否是您正在寻找的方法。例如,您知道的一系列方法当时应该按给定的顺序在堆栈上,但允许任何其他中间堆栈元素出现。否则,您的代码中的任何更改都会使建议停止工作。

于 2011-01-30T20:22:41.337 回答