Java 可以将';大约';建议是否可以从单独的功能执行?

Java 可以将';大约';建议是否可以从单独的功能执行?,java,aspectj,Java,Aspectj,我需要执行一些常见的代码来获得一些“周围”的建议。因此,我将通用代码移到了一个函数中。但我的问题是,在这个公共函数中,procedure()不起作用。请参阅下面的代码 aspect MyAspect { pointcut myPointCut() : execution(* com.test.MyTestInterface.*(..)); Object around() : myPointCut() { Object retVal = null;

我需要执行一些常见的代码来获得一些“周围”的建议。因此,我将通用代码移到了一个函数中。但我的问题是,在这个公共函数中,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()”已打印,但下一条语句不执行切入点截获的方法


有什么方法可以做到这一点吗?

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


您可以在around advice方法内部定义的匿名类的方法中包装
procedure
调用。如图1所示:


谢谢你,弗雷德。这正是我所做的。我昨天就想出来了,我不得不写笔记回到这个论坛并留下最新消息。你赢了我!谢谢你,布鲁诺。我没有尝试你建议的方法。我使用上一篇文章中提到的注释来实现它。我发现这种方法更简单。谢谢你的回复。
  @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();
       }
     }
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(); }
    });
  }
}