Java使用PropertyChangeSupport和PropertyChangeListener检测变量更改

时间:2011-01-03 21:50:17

标签: java propertychangesupport

当某些第三方代码更改变量时,我正在尝试打印出调试语句。例如,请考虑以下事项:

public final class MysteryClass {

private int secretCounter;

public synchronized int getCounter() {
    return secretCounter;
}

public synchronized void incrementCounter() {
    secretCounter++;
}

}

public class MyClass {

public static void main(String[] args) {
    MysteryClass mysteryClass = new MysteryClass();
    // add code here to detect calls to incrementCounter and print a debug message
}

我没有能力更改第三方MysteryClass,所以我认为我可以使用PropertyChangeSupport和PropertyChangeListener来检测对secretCounter的更改:

public class MyClass implements PropertyChangeListener {

    private PropertyChangeSupport propertySupport = new PropertyChangeSupport(this);

    public MyClass() {
        propertySupport.addPropertyChangeListener(this);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        System.out.println("property changing: " + evt.getPropertyName());
    }

    public static void main(String[] args) {
        MysteryClass mysteryClass = new MysteryClass();
        // do logic which involves increment and getting the value of MysteryClass
    }
}

不幸的是,这不起作用,我没有打印出调试信息。有谁看到我的PropertyChangeSupport和Listener接口的实现有什么问题?我想在调用incrementCounter或secretCounter的值发生变化时打印调试语句。

2 个答案:

答案 0 :(得分:0)

我非常确定PropertyChangeListener机制仅在通过PropertyEditor机制设置属性时才有效,而不是通过getter和setter

我可能会尝试使用AspectJ,但你只能建议方法调用,而不是执行,因为第三方类是最终的。

答案 1 :(得分:0)

我很遗憾地说这个,但是在MysteryClass实现的情况下,如果你无法改变它的实现,你就不能,顺便提一下,你得到的PropertyChangeListener PropertyChangeSupport概念都是错误的。使其工作PropertyChangeSupport MysteryClass见Java Beans Tutorial on Bound properties 你可以做的是用你自己的类包装类让我们说MysteryClassWithPrint将实现所有公共方法作为委托给MysteryClass的内部实例和打印消息 然后将所有new MysteryClass();替换为新的MysteryClassWithPrint();