0

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

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
}

我没有能力更改第 3 方 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 的值发生变化时,我都想打印一条调试语句。

4

2 回答 2

0

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

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

于 2011-01-03T21:57:28.930 回答
0

我很抱歉这么说,但如果是 MysteryClass 实现,并且如果您无法更改它的实现,那么您也无法更改 PropertyChangeListener PropertyChangeSupport 概念。要使其工作 PropertyChangeSupport MysteryClass 请参阅Java Beans Tutorial on Bound properties 你可以做的是用你自己的类包装类让我们说 MysteryClassWithPrint 它将实现所有公共方法作为对 MysteryClass 的内部实例的委托并打印消息然后全部替换 new MysteryClass();为新的MysteryClassWithPrint();

于 2011-01-03T22:06:28.517 回答