どういう意味
[アドバイス実行ポイントカット]が機能していません
私にとっては、次のように問題なく動作します。
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)