Java обнаруживает изменение переменной с помощью PropertyChangeSupport и PropertyChangeListener - PullRequest
0 голосов
/ 04 января 2011

Я пытаюсь распечатать отладочные операторы, когда какой-либо сторонний код изменяет переменную. Например, рассмотрим следующее:

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 голосов
/ 04 января 2011

Мне очень жаль это говорить, но в случае реализации MysteryClass и если вы не можете изменить ее реализацию, вы не можете и, кстати, неправильно поняли концепцию PropertyChangeListener PropertyChangeSupport.чтобы заставить это работатьMysteryClass И распечатывает сообщения, а затем заменяет все new MysteryClass(); на новые MysteryClassWithPrint();

0 голосов
/ 04 января 2011

Я почти уверен, что механизм PropertyChangeListener работает, только если вы устанавливаете свойства с помощью механизма PropertyEditor, а не через геттеры и сеттеры

Вероятно, я бы попробовал это с AspectJ, но вы можете посоветовать только вызовы методов, а не выполнение, поскольку сторонний класс является окончательным.

...