Help us understand the problem. What is going on with this article?

AspectJのJoin PointsとPointcutとは何なのか

More than 3 years have passed since last update.

はじめに

この記事はAspectJ公式プログラミングガイドを訳したものです。
公式プログラミングガイド

Join Points と Pointcut

以下のクラスを例に、考えていきます。

Point.java
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自体で構成されます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away