2017-08-14 4 views
1

私はこのような何かを持っていると思いますメソッドが実行されて新しい文字列値で実行されるようになります。したがって、メソッドがパラメータ "I'm at the foo"で呼び出された場合それは実際には "私はバーにいます"と実行する必要があります。AspectJのメソッドパラメータの変更値

この作業の仕方はわかりません。私はこれをしばらく手伝ってきました。のは、私が最後にこの時点で終わったとしましょう:私は間違って

@Documented 
@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.LOCAL_VARIABLE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ReplaceFooBar { 
} 

そして...

@Aspect 
public aspect ReplaceFooBarAspect { 
    @Before("@annotation(ReplaceFooBar)") 
    public String replaceFooBar(String value) { 
     if (value == null) { 
      return null; 
     } 
     return value.replaceAll("foo", "bar"); 
    } 
} 

何をしているのですか?

私のコードがコンパイルされていない、私はこれらのようなエラーが発生しています。

Error:(6, 0) ajc: Duplicate annotation @Aspect 
Error:(7, 0) ajc: aspects cannot have @Aspect annotation 
Error:(10, 0) ajc: This advice must return void 
Error:(10, 0) ajc: formal unbound in pointcut 

私はこれらの側面が正確にどのように動作するかわからないが、どのように私はそれを望むように取り組んでこれを取得します。

+0

うーん...それもコンパイルされません。私はそれが私を助ける方法を知っている人には明らかだったと思った。エラー:(6、0)ajc:Duplicate annotation @Aspect Error:(7、0)ajc:aspectは@Aspectアノテーションを持つことができませんエラー:(10、0)ajc: (10、0)ajc:ポイントカットで正式にバインドされていない ' – morgoth84

+0

なぜこれが重要なのか本当に分かりません。これらの側面を知っている人にとっては、それがコンパイルされていないことは完全に明らかでなければなりません。それを追加することで、私は不必要なデータで質問を乱雑にしています。しかし、それがあなたを幸せにするなら、大丈夫です。 – morgoth84

+0

私はそれを書く方法を知っていれば、確かにあなたに検証可能なコードを与えたいと思います。私は数時間をかけて成功しなければ今日働かそうと努力しました。だから私はここで誰かが答えを知っていると思っていたかもしれません、そして、私はすぐに彼/彼女がすぐに明らかになるでしょう。だから私の代わりにそれにもっと多くの時間を費やす人は、自分の時間の5分で直接私を助けることができます。残念ながら、私はAspectJのチュートリアルを今すぐやり、すべての詳細を自分で学ぶ日はありません。 – morgoth84

答えて

2

異なる引数でメソッドを実行するには、@Aroundアドバイスを使用して、コード内で手動で引数を置き換える必要があります。例えば

@Around("execution(* *(.., @aspectjtest.ReplaceFooBar (*), ..))") 
public Object replaceFooBar(ProceedingJoinPoint pjp) throws Throwable { 
    //get original args 
    Object[] args = pjp.getArgs(); 

    //get all annotations for arguments 
    MethodSignature signature = (MethodSignature) pjp.getSignature(); 
    String methodName = signature.getMethod().getName(); 
    Class<?>[] parameterTypes = signature.getMethod().getParameterTypes(); 
    Annotation[][] annotations; 
    try { 
     annotations = pjp.getTarget().getClass(). 
       getMethod(methodName, parameterTypes).getParameterAnnotations(); 
    } catch (Exception e) { 
     throw new SoftException(e); 
    } 

    //Find annotated argument 
    for (int i = 0; i < args.length; i++) { 
     for (Annotation annotation : annotations[i]) { 
      if (annotation.annotationType() == ReplaceFooBar.class) { 
       Object raw = args[i]; 
       if (raw instanceof String) { 
        // and replace it with a new value 
        args[i] = ((String) raw).replaceAll("foo", "bar"); 
       } 
      } 
     } 
    } 
    //execute original method with new args 
    return pjp.proceed(args); 
} 
+0

ありがとうございました!私からの仮想のクッキーを持ってください。 (o) – morgoth84

関連する問題