调用方面声明的方法

时间:2013-04-06 03:28:03

标签: java aspectj

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类是不可见的(尽管我已将其公开)。

1 个答案:

答案 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