Bijuの答えにはコメントできないので、新しいものを作成しています:
あなたは尋ねました:
問題があります: 「アドバイス [...] が適用されていません [Xlint:adviceDidNotMatch]」 - ポイントカットが Java メソッドと一致しなくなったようです
さて、どのように一致させるべきですか?静的メソッドを実行すると(あなたは自分で言った)、this
オブジェクトがないので、ポイントカットcall()
はexecution()
. 以下は、デモ用に作成した完全なコード サンプルです。
アプリケーション クラス:
package de.scrum_master.aspectj.sample;
import java.util.Random;
public class Dummy {
static Random random = new Random();
static void myMethod_one() throws InterruptedException {
Thread.sleep(random.nextInt(1000));
}
static String myMethod_two(int dummy) throws InterruptedException {
Thread.sleep(random.nextInt(1000));
return "dummy";
}
static int myMethod_three(double foo, String... dummy) throws InterruptedException {
Thread.sleep(random.nextInt(1000));
return -1;
}
public static void main(String[] args) throws InterruptedException {
// We have no "this" here (static method), so advice is not applied
myMethod_two(5);
myMethod_one();
myMethod_three(7.7, "foo", "bar");
// Now let's create an object, so we have "this"
new Dummy().doStuff();
}
void doStuff() throws InterruptedException {
// Here advice is applied because we have "this"
myMethod_one();
myMethod_two(5);
myMethod_one();
myMethod_three(7.7, "foo", "bar");
myMethod_three(3.3, "zot", "baz");
myMethod_two(11);
}
}
タイミングの側面:
package de.scrum_master.aspectj.sample;
aspect TimingAspect {
pointcut calculation(Object thisObject) :
call(* myMethod_*(..)) && this(thisObject);
Object around(Object thisObject) : calculation(thisObject) {
long start = System.nanoTime();
Object result = proceed(thisObject);
long end = System.nanoTime();
System.out.println(String.format(
"%s (this = %s) took %d ns",
thisJoinPointStaticPart.getSignature(),
thisObject,
end - start
));
return result;
}
}