2012-02-29 3 views
3

いくつかの「周りの」アドバイスに共通のコードを実行する必要があります。だから、私は共通コードを関数に移しました。しかし、私が持っている問題は、proceed()がこの共通関数の中で動作しないということです。以下のコードをご覧ください。'around'アドバイスの内容を別の関数から実行できますか?

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にキャストする機能が動作しません。 "inside myfunction()"が出力されますが、次のステートメントはpointcutによって傍受されたメソッドを実行しません。

これを達成する方法はありますか?

答えて

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

ありがとう、@フレッド。これはまさに私がやったことです。私は昨日それを理解し、私はこのフォーラムに復帰し、更新を残すことに注意しなければならなかった。あなたは私にそれを打つ! –

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

ありがとう、@ブリュノ。あなたが提案した方法を試してみませんでした。前の記事で説明したアノテーションを使用して作業するようにしました。私はそのアプローチが簡単だとわかります。しかし、あなたの応答を感謝します。 –

関連する問題