'around'建议的内容可以从单独的函数执行吗?

时间:2012-02-29 22:24:44

标签: java aspectj

我需要为几个'周围执行一些常用代码。建议。所以,我已将公共代码移动到一个函数。但我遇到的问题是,proceed()在这个常用函数中不起作用。请参阅下面的代码。

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();
    }
}

将thisJoinPoint转换为ProceedingJoinPoint并不起作用。 "在myfunction()"打印,但下一个语句不执行切入点截获的方法。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

我没有使用传统语法,但我想我可能有@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();
       }
     }

答案 1 :(得分:1)

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

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(); }
    });
  }
}