はじめに
この記事はAspectJ公式プログラミングガイドを訳したものです。
公式プログラミングガイド
Join Points と Pointcut
以下のクラスを例に、考えていきます。
class Point {
private int x, y;
Point(int x, int y) { this.x = x; this.y = y; }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
int getX() { return x; }
int getY() { return y; }
}
AspectJのjoin pointsとpointcutをより直感的に理解するために、Javaの基本的な原則に戻ってみましょう。以下のメソッドはPointクラスに宣言されているものです。
void setX(int x) { this.x = x; }
このプログラムは、「メソッドの名前は setX であり、int型の引数を一つ必要とし、Point型のオブジェクトとして呼ばれる。その際に、メソッドの本体である { this.x = x; } が実行される」ことを表しています。
この事より、一つの様式が明らかになります。それは何かが起きたときというのは、何かが実行された時である、ということです。以上の例だと「メソッドの呼び出し = 起こる 、 メソッドの実行 = 実行」という関係になります。
OOPにおいては、様々な種類の”起こる”があり、それらは言語によって決定されます。我々はこれをJavaにおいてJoin Pointと呼びます。Join Pointは例のようにメソッド呼び出しや、メソッドの実行、オブジェクトのインスタンス化、コンストラクタの実行、フィールドの参照のようなもので構成されています。
完全なるJoin PoiuntのリストはAspectJ Quick Referenceに載っています。
そしてPointcutはこれらのJoin Pointの集合から、いくつかのJoin Point(部分集合)を選択することです。以下はPointcutの例です。
pointcut setter(): target(Point) &&
(call(void setX(int)) ||
call(void setY(int)));
このPointcutの例ではsetX(int)もしくはsetY(int)が、Pointのインスタンスとして呼ばれた際のJoin Pointを選択しています。また、他の例として以下があります。
pointcut ioHandler(): within(MyClass) && handler(IOException);
この例ではMyClassというクラス内で定義されたコードにおいて、IOException型の例外がキャッチされた際のJoin Pointを選択しています。
Pointcutの構成
Pointcutはコロンによって分割された左式と右式によって構成されています。左の式でPointcutの名前、Pointcutのパラメーターによって構成されます。右の式ではPointcut自体で構成されます。