有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

建议中关于以前建议的java信息

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

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

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

我有一个建议,切入点两种方法:

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

}

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


共 (1) 个答案

  1. # 1 楼答案

    我想你需要的是cflowbelow(...)。从AspectJ documentation开始:

    cflowbelow(Pointcut): Picks out each join point in the control flow of any join point P picked out by Pointcut, but not P itself.

    您需要将!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);
    }