假设我们有一个具有以下2种方法的类:

public String getA() {
    return "A";
}

public String getAB() {
    return getA() + "B";
}


我有一条建议切入这两种方法:

@Before(...)
public void beforePointCut() {

}


如果调用方法getA(),则切入点将被调用一次。
当我调用方法getAB()时,切入点被调用两次,因为该方法也需要在内部调用getA()
我想要的是仅在调用方法getAB()时调用一次建议。可能吗?我不想将建议分为两个建议,因为我有数百种方法,其中许多方法会相互调用。

最佳答案

我认为您需要的是cflowbelow(...)。从AspectJ documentation


  cflowbelow(Pointcut):拾取Pointcut拾取的任何连接点P的控制流中的每个连接点,但不拾取P本身。


您需要在切入点表达式中添加!cflowbelow(beforePointcut()),类似于:

@Pointcut("execution(* YourClass.get*(..))")
public void beforePointcut() {}

@Pointcut("beforePointcut() && !cflowbelow(beforePointcut())")
public void beforePointcutOnlyOnce() {}

@Before("beforePointcutOnlyOnce()")
public void beforeAdvice(JoinPoint joinPoint) {
    System.out.println("before " + joinPoint);
}

10-08 17:12