6

次のコードはなぜですか:

 pointcut callsToList() : call(* List.*(..));

 before(List l) : callsToList() && target(l) {
  System.out.println("cool");
 }

次の警告が生成されます。

org.eclipse.ajdt.examples.ListAdvice で定義されたアドバイスが適用されていません [Xlint:adviceDidNotMatch]

私はEclipseで作業しています。私はEclipseのaspectjプラグインをインストールしました。もちろん、私のプロジェクトはaspectjプロジェクトです。

編集: さらに、ajdt プラグインによって提供される実際の例から始めました。

pointcut callsToBeginTask() : call(void IProgressMonitor.beginTask(..)); 
before() : callsToBeginTask() {
     System.out.println("cool");
};

この例が警告なしで機能するという事実を除いて、違いはわかりません...

4

2 に答える 2

3

AspectJ を OSGi 環境で動作させたい場合は、Equinox Aspects (別名 Equinox Weaving) を使用する必要があります。これは、osgi クラスローダで動作するロード時織りの形式です。

このチュートリアルは少し古くなっていますが、すぐに始められるはずです。

http://www.eclipse.org/equinox/incubator/aspects/equinox-aspects-quick-start.php

アスペクトがすべて同じプロジェクト内でターゲットにされている場合、Equinox アスペクトは必要ありません。通常のコンパイル時のウィービングで十分ですが、複数のバンドル/プラグインにまたがるためには機能しません。

于 2010-11-04T19:23:43.617 に答える
2

私の推測では、 List はインターフェイスであり、すべての拡張クラスへの呼び出しを一致させたいため、次の構文を使用する必要があります。

pointcut callsToList() : call(* List+.*(..));

更新: OK、このバージョンで動作するようになりました:

pointcut callsToList(List list) :
    call(* java.util.List+.*(..)) && target(list);

Object around(List l) : callsToList(l) {
    // code here
}

これも機能します:

before(List l) : callsToList(l) {
    // code here
}
于 2010-11-04T13:39:01.507 に答える