有 Java 编程相关的问题?

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

java“around”通知的内容可以从单独的函数执行吗?

我需要执行一些常见的代码来获得一些“周围”的建议。因此,我将通用代码移到了一个函数中。但我的问题是,在这个公共函数中,procedure()不起作用。请参阅下面的代码

aspect MyAspect {
    pointcut myPointCut() : execution(* com.test.MyTestInterface.*(..));

    Object around() : myPointCut() {
        Object retVal = null;
        try {
            ProceedingJoinPoint pjp = (ProceedingJoinPoint) thisJoinPoint;
            myfunction(pjp);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return retVal;
    }

    public void myfunction(ProceedingJoinPoint pjp) {
        System.out.println("Inside myfunction()" + pjp.getSignature());
        pjp.proceed();
    }
}

将此连接点强制转换为处理连接点无效。“Inside myfunction()”已打印,但下一条语句不执行切入点截获的方法

有没有办法做到这一点


共 (2) 个答案

  1. # 1 楼答案

    您可以将proceed调用包装在您在around advice方法中定义的匿名类的方法中。如this paper中的图1所示:

    interface Proceedable {
      public void doProceed();
    }
    
    public aspect MyAspect {
      public void auxMethod(Proceedable p) {
        // Can invoke p.doProceed()
      }
      void around(): somePointcut() {
        auxMethod(new Proceedable() {
          public void doProceed() { proceed(); }
        });
      }
    }
    
  2. # 2 楼答案

    我没有让它使用传统的语法,但我想我可能有一个解决方案@AspectJ Syntax

      @Aspect
         public class MyAspect {
    
        @Around("execution(* *(..)) && !within(MyAspect)")
           public Object aroundTest(ProceedingJoinPoint thisJoinPoint){
            Object retVal = null;
               try {
                    myfunction(thisJoinPoint);
                } catch (Throwable e) {
                    e.printStackTrace();
                }
                return retVal;
           }
    
           public void myfunction(ProceedingJoinPoint pjp) throws Throwable {
               System.out.println("Inside myfunction(): " + pjp.getSignature());
               pjp.proceed();
           }
         }