0

本页展示了如何向现有类添加方法,然后展示如何在切面内声明调用这些附加方法的方法。

这是该页面的代码:

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);

但是,我的 Java 类看不到“方面”PointObserving(尽管我已将其声明为公共)。

4

1 回答 1

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
于 2013-04-07T15:42:59.613 回答