2016-06-16 4 views
1

注釈付きのAspectJを使用して、すべてのAspectJのアドバイスを無効にしてメソッドのアドバイスをユーザーの入力から停止する方法を見つけようとしています(ブールトラッキング= false)。if()メソッドとユーザーの入力によるメソッドのアドバイスを停止するためのAspectJの無効化

ここはメインクラスのコードです。

package testMaven; 


public class MainApp { 

    public static void main(String[] args) { 
     testing test = new testing(); 
     test.aa(1000); 
     test.setDd(3); 
    } 

} 

ここにはアスペクトアノテーションクラスがあります。

package testMaven; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 
import org.aspectj.lang.annotation.Before; 

@Aspect 
public class aspecter { 

    public aspecter(){ 

    } 

    boolean tracked = false; 

    @Before("execution(* testMaven.testing.aa(..)) && if(tracked)") 
    public void testBefore(){ 
     System.out.println("yooi"); 
    } 

    @Before("execution(* testMaven.testing.setDd(..)) && if(tracked) ") 
    public void testBefore2(){ 
     System.out.println("yooi2"); 
    } 
} 

場合(追跡)の実行 "トークンに構文エラー "のエラーになります(* testMaven.testing.aa(..))& &場合(追跡)"、" 注釈スタイルで、もし( ...)pointcutsにはコードを含めることはできません。 if()を使用し、注釈付きメソッド "expected"にコードを挿入します。

私の仕様に基づいてif()メソッドを指定できましたか?

おかげ

+0

使用しているAspectJとJavaのバージョンは何ですか?コンパイル時の織り方やローディングの時間を使用していますか? https://eclipse.org/aspectj/doc/released/adk15notebook/ataspectj-pcadvice.htmlの「if()ポイントカット式」のセクションを読んでいましたか? –

+0

@WimDeleau私は1.8.9のMavenとJava8を使用しています。はい、私は[This](https://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-pcadvice.html#d0e3697)とStackoverflowの他の質問に従っていますが、それらの答えは本当に複雑です。私は質問のための日食のチュートリアルに従っています –

答えて

4

ドキュメントは(https://eclipse.org/aspectj/doc/released/adk15notebook/ataspectj-pcadvice.html)について説明してあなたは、違っを少ししなければならない注釈スタイルを使用している場合。

static boolean tracked = false; 

@Pointcut("if()") 
public static boolean tracked() { 
    return tracked; 
} 

@Before("execution(* testMaven.testing.aa(..)) && tracked()") 
public void testBefore(){ 
    System.out.println("yooi"); 
} 

@Before("execution(* testMaven.testing.setDd(..)) && tracked() ") 
public void testBefore2(){ 
    System.out.println("yooi2"); 
} 

お知らせ通常コードスタイル面でif(...)句に行くだろうコードが@Pointcutif()を使用してタグ付けされたメソッド本体、に今ある:あなたのケースでは、あなたの側面は、このようなものである必要があります。私はフィールドを静的にしなければなりませんでした。 tracked()メソッドのコードを変更して、Aspects.aspectOf()を非静的にすることができます。

+0

それはありがとうございます!私はまだAspects.aspectOf()を実装する方法が混乱していますが、静的なものを使用することは問題ありません。 –

+0

https://eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-aspectof.htmlを参照してください - シングルトンのアスペクトについては、おそらく次のようなものが必要です:Aspects.aspectOf(aspecter.class).trackedあなたのpointcutメソッド( '私のサンプルコードではtracked() ') - アスペクトのシングルトンインスタンスにアクセスし、そのインスタンス上の非静的な追跡フィールドにアクセスします。 –

関連する問題