This page显示了如何向现有类添加方法,然后展示如何在调用这些附加方法的方面内声明方法。
这是该页面的代码:
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类是不可见的(尽管我已将其公开)。
答案 0 :(得分:0)
我找到了一种方法 - 显然,aspectJ不仅可以定义额外的字段,还可以定义方法。为此,我们只需要修改下面的方面(请注意我已将static
替换为Point.
)
aspect PointObserving {
private Vector Point.observers = new Vector();
public void Point.addObserver(Point p, Screen s) {
observers.add(s); //Legal to access observers here
}
public void Point.removeObserver(Point p, Screen s) {
observers.remove(s); //Legal to access observers here
}
//Rest remains same as before.
}
现在在普通Java类的某个地方,我可以这样做:
Point p = new Point(120, 230);
Screen s = getScreen();
p.addObserver(s);
此外,值得将观察者声明为弱引用。因此,
private Collection<Screen> Point.observers = Collections.newSetFromMap(new WeakHashMap<Screen, Boolean>());
//Rest remains same