このページでは、既存のクラスにメソッドを追加する方法を示し、それらの追加メソッドを呼び出すアスペクト内でメソッドを宣言する方法を示します。
これはそのページのコードです:
aspect PointObserving {
private Vector Point.observers = new Vector();
public static void addObserver(Point p, Screen s) {
p.observers.add(s);
}
public static void removeObserver(Point p, Screen s) {
p.observers.remove(s);
}
pointcut changes(Point p): target(p) && call(void Point.set*(int));
after(Point p): changes(p) {
Iterator iter = p.observers.iterator();
while ( iter.hasNext() ) {
updateObserver(p, (Screen)iter.next());
}
}
static void updateObserver(Point p, Screen s) {
s.display(p);
}
}
このパターンを同じ設定 (オブザーバー パターン) で再利用しようとしていますが、Java コードのどこからでもオブザーバーを追加できるようにしたいと考えています。したがって、そのページに示されている例では、パッケージ内の別のクラスから次のようなことをしたいと考えています。
Point p = new Point(120, 230);
Screen s = getScreen();
PointObserving.addObserver(p, s);
ただし、「アスペクト」の PointObserving は、私の Java クラスには表示されません (パブリックに宣言しましたが)。