1

アドバイスCachingAspectを使用して、適切に注釈が付けられたメソッドでいくつかの単純なキャッシュを実行するがあります。aroundさて、私がやりたいのはaround、特にキャッシングとアドバイスを追跡することです。

これまでのところ、アドバイス内でメソッド呼び出しをインターセプトすることはできますaroundが、アドバイス自体をインターセプトすることはできません。around最終的には、アドバイスがアドバイスしているメソッドの署名を取得したいと思います。出来ますか?

前もって感謝します!

4

3 に答える 3

1

adviceexecution()ポイントカットを参照してください。

于 2011-05-18T10:13:00.187 に答える
1

アドバイス内でthisJoinPoint.getSignature()を使用して、次のようなメソッドシグネチャを取得できます。

pointcut tolog1() : execution(* Activity+.*(..)) ;
before() : tolog1() {
    String method = thisJoinPoint.getSignature().toShortString();

    Log.d(ATAG, "=========== entering " + method+", parms="+Arrays.toString(thisJoinPoint.getArgs()));
}
于 2011-05-19T13:23:32.620 に答える
1

どういう意味

[アドバイス実行ポイントカット]が機能していません

私にとっては、次のように問題なく動作します。

public aspect MetaAspect {
    before() : within(DummyAspect) && adviceexecution() {
        System.out.println("MetaAspect: " + thisJoinPointStaticPart.getSignature());
        for (Object arg : thisJoinPoint.getArgs())
            System.out.println("    " + arg);
    }
}

その時点から、印刷された署名を見ると、複数あり、署名が異なる場合に、DummyAspectから選択するアドバイスをさらに絞り込むことができるはずです。


アップデート:

adviceexecution()さて、あなたはあなたの質問を編集し、あなたが決定する必要があるのはただだけでなく、傍受されたメソッドの署名でもあると述べました。そのための100%の解決策はありませんが、傍受されたアドバイスが何らかの方法でのメソッドを参照していることを確認するとthisJoinPointStaticPart、インスタンスがJoinPoint.StaticPartアドバイス自体の署名に追加され、メタアスペクトからアクセスできるようになります。完全なコードサンプルは次のとおりです。

ドライバーアプリケーション:

package de.scrum_master.app;

public class Application {
    public static void main(String[] args) {
        Application application = new Application();
        application.writeProperty("fullName", "John Doe");
        application.readProperty("firstName");
        application.doSomething(11);
    }

    public void writeProperty(String name, String value) {}
    public String readProperty(String name) { return "foo"; }
    public void doSomething(int number) {}
}

キャッシングの側面:

package de.scrum_master.aspect;

public aspect CachingAspect {
    pointcut readMethods(String propertyName) :
        execution(* *.read*(String)) && args(propertyName);

    before(String propertyName) : readMethods(propertyName) {
        System.out.println(
            "[CachingAspect] Read method called for property '" + propertyName + "'"
        );
    }

    Object around(String propertyName) : readMethods(propertyName) {
        System.out.println(
            "[CachingAspect] Caching property '" + propertyName +
            "' in method " + thisJoinPointStaticPart.getSignature()
        );
        return proceed(propertyName);
    }
}

ご覧のとおり、この側面には2つのアドバイスがあります。1つ目は参加ポイントのメンバーにアクセスせず、2つ目はアクセスします。つまり、メタアスペクトでのみ2番目のターゲットシグネチャを見つけることができます。

メタアスペクト:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint.StaticPart;

public aspect AdviceInterceptor {
    before() : within(CachingAspect) && adviceexecution() {
        System.out.println("[AdviceInterceptor] Intercepting " + thisJoinPointStaticPart);
        boolean foundSignature = false;
        for (Object arg : thisJoinPoint.getArgs()) {
            if (arg instanceof StaticPart) {
                foundSignature = true;
                StaticPart jpStaticPart = (StaticPart) arg;
                System.out.println("[AdviceInterceptor] Target method = " + jpStaticPart.getSignature());
                break;
            }
        }
        if (!foundSignature)
            System.out.println("[AdviceInterceptor] Target method cannot be determined from advice signature");
    }
}

JoinPoint.StaticPartメタアドバイスは、タイプパラメータを見つけるために、そのパラメータを繰り返し処理します。見つかった場合はターゲット署名を出力し、見つからなかった場合はループ後に失敗メモを出力します。

サンプル出力:

[AdviceInterceptor] Intercepting adviceexecution(void de.scrum_master.aspect.CachingAspect.before(String))
[AdviceInterceptor] Target method cannot be determined from advice signature
[CachingAspect] Read method called for property 'firstName'
[AdviceInterceptor] Intercepting adviceexecution(Object de.scrum_master.aspect.CachingAspect.around(String, AroundClosure, JoinPoint.StaticPart))
[AdviceInterceptor] Target method = String de.scrum_master.app.Application.readProperty(String)
[CachingAspect] Caching property 'firstName' in method String de.scrum_master.app.Application.readProperty(String)
于 2012-08-09T16:21:53.263 に答える