0

すべてのメソッド実行をキャプチャしたいと思います。そのため、ポイントカットの下に定義し、get/set ポイントカット指定子を使用してフィールド アクセスを除外しようとしましたが、機能しません。

助言がありますか?どうもありがとう。

 pointcut funcExecutionPointcut():execution(* *.*(..)) && !get(* *.*) && !set(* *.*);

   before():funcExecutionPointcut()     {

             //log some info.   
             Signature sig = thisJoinPointStaticPart.getSignature();
              String className = "";
        if (thisJoinPoint.getThis() != null)
            className = thisJoinPoint.getThis().getClass().getName();
            mylogger.log(Level.INFO,"Entering [(" + className + ")" + sig.toShortString() + "] @" + line + "@" +file);
 }

問題は、出力がクラスのフィールドもポイントカットによってヒットしたことを示していることです。以下のようにログします。

2013-09-30 11:39:11:18  Thread-447      INFO AspectJFuncTracing - Entering [()ImageListManager.access$0(..)] @48@ImageListManager.java
2013-09-30 11:39:11:19  Thread-447      INFO AspectJFuncTracing - Entering [()ImageListManager.access$1(..)] @56@ImageListManager.java

対応するソースコードは以下の通りです。

    ....
    public void run() {

        while (mThreadBeing) {
            try {
                sleep(sleeptime);
            } catch (Exception e) {
                e.printStackTrace();
            }
            sleeptime = 200;
            if (!mThreadBeing) {
                break;
            }
            if (mScrolling) {
                continue;
            }
                            ...

ImageListManager.access$0 はクラス フィールド mThreadBeing を指し、ImageListManager.access$1 はクラス フィールド mScrolling を指します。

4

1 に答える 1

1

これらは合成メソッドの実行であり、コンパイラによって作成されます。これは、あなたが書き留めたことから、run()メソッドがImageListManagerの内部クラス内にあるためです。それらは、1 番目と 2 番目に定義されたフィールドの値の取得を担当します (アクセス後の $0 と $1 から想定)。

その実行を削除したい場合は、ポイントカットと and-clause を次のように入力します。

!execution(* *.access$*(..))

それが役に立てば幸い、

ダリオ。

于 2013-12-06T12:37:41.277 に答える