minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

declare

今までの例では、JoinPointに到達したときに特定のJavaロジックを実行していました。
AspectJではこの他に「条件を満たしたときにコンパイルエラー(警告)を発生させる」
といった事が可能です。
これは相当使える機能です。

例えば、「setterメソッド以外でフィールドに直接アクセスしていたら警告にする」なども
簡単に実現できます。
以下にコードを載せます。

declare warning :
    set(* *) &&
    !withincode(* set*(..)) :
        "writing field outside setter.";
declare warning

条件が満たされたときに、コンパイル警告を発生させます。

set(* *)

フィールドに値を代入するときに条件が満たされます。

!withincode(* set*(..))

setで始まるメソッド名以外で処理が実行されたときに条件が満たされます。

"writing field outside setter."

条件を満たしたときに発生させる警告文を定義します。

以上により、setXXXメソッド以外からフィールドに値を代入している箇所で
コンパイル警告が発生します。
ちなみに、

declare error :

とすると、警告ではなくコンパイルエラーが発生します。

set キーワードで、フィールドに値を代入するコードに
JoinPointが設定されます。
第1パラメータにはフィールドのクラス名、
第2パラメータにはフィールド名を記述します。

例えば、System.outフィールドにアクセスした際に警告を発するには
以下のように記述します。

declare warning :
    get(java.io.PrintStream System.out) : "access System.out field";