在不使用 cflow 的情况下从 around advice 调用 adviced 方法并避免无限循环

问题描述 投票:0回答:0

我想使用 AspectJ 捕获 com.ABC.MyClass 中的所有方法执行

 package com.ABC
 
 public class MyClass{
       
        public methodA(){
        }

        public methodB(){
          methodA();
        }
 }

以下是看点:

@Aspect
public class MyAspect{
  @Pointcut("execution(* com.ABC.MyClass.*(..))")
  public void captureMyClassMethods(){
  }
  
  @Around("captureMyClassMethods()")
  public Object aroundMyClassMethods(ProceedingJoinPoint jp) throws Throwable{
    MyClass object = (MyClass)jp.getTarget();

    object.methodA();      //This causes infinite loop

    Object o = jp.proceed();
    System.out.println("Some data from o");
    return o;
  }
}

正如 around advice 的评论中提到的,从 advice 调用 methodA() 会导致无限循环。

正如在另一个 stackoverflow 答案中提到的 Aspectj - 如何在不触发无限循环的情况下从相同的建议中调用建议的方法 如果我更改下面的切入点表达式,那么当从 methodB( ) 因为它将在方面控制流程。

@Pointcut("execution(* com.ABC.MyClass.*(..)) && !cflow(within(MyAspect))")

我能想到的另一种方法是使用 before 和 after advices 而不是 around advices。但我想知道是否有办法通过 around advice 来处理这个问题?

java infinite-loop aspectj pointcut
© www.soinside.com 2019 - 2024. All rights reserved.