1

私は自分のプログラムの分析にaspectjを使用しています。現在、私の側面は次のようになります。

@Aspect
public class InvokeAspect {
    @Before("anyCall(t, s)")
    public void processInvocation(JoinPoint point, JoinPoint.EnclosingStaticPart enclosingStatic, Object t, Object s){
        System.out.println("***");
        System.out.println("Invoker: " + s.toString());
        System.out.println("Invoker: " + enclosingStatic.getSignature().toLongString());
        System.out.println("Invoked object: " + t.toString());
        System.out.println("Invoked: " + point.getSignature().toLongString());
        System.out.println("");
        System.out.println("***");
    }
    @Pointcut("call(* *(..)) && !within(cz.cvut.kbss.odra..*) && target(t) && this(s)")
    public void anyCall(Object t, Object s){}
}

すべてが期待どおりに機能しますが、これまたはソースが存在しない場合でも、アスペクトを使用するようにアスペクトjを説得する方法はありますか?(静的メソッド呼び出しまたは静的メソッドからの呼び出し)。それとも私は3つの側面を書く必要がありますか?

ありがとう。

4

2 に答える 2

3

targetthisオブジェクトを動的に決定する場合は、1つのポイントカットと1つのアドバイスでそれを行うこともできます。POJOアノテーションスタイルに慣れていないため、これをAspectJ構文で記述しています。

public aspect InvokeAspect {
    pointcut anyCall() : call(* *(..)) && !within(cz.cvut.kbss.odra..*);

    before() : anyCall() {
        Object s = thisJoinPoint.getThis();
        Object t = thisJoinPoint.getTarget();
        // and so forth
    }
}

これで、適切と思われるものを印刷またはログに記録できます。それらのようなメソッドを呼び出したい場合は、null値のチェックsとチェックに注意してください。ttoString()

于 2012-08-10T11:49:21.297 に答える
0

はい、私はあなたが3つのポイントカットを書かなければならないと思います-1つはあなたが持っているものに沿って、2つ目は静的メソッドからの呼び出し、そして3つ目はオブジェクトから静的メソッドへの呼び出し、おそらく3つの異なるアドバイスも委任します上記のprocessInvocation方法

于 2012-08-03T11:43:32.227 に答える