Java détecter le changement variable à l'aide PropertyChangeSupport et PropertyChangeListener

StackOverflow https://stackoverflow.com/questions/4588683

  •  14-10-2019
  •  | 
  •  

Question

Je suis en train d'imprimer des instructions de débogage quand un code tiers change une variable. Par exemple, considérez ce qui suit:

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
}

Je n'ai pas la possibilité de changer la MysteryClass 3ème partie, donc je pensais que je pouvais utiliser PropertyChangeSupport et PropertyChangeListener pour détecter les changements au 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
    }
}

Malheureusement, cela ne fonctionne pas et je n'ai pas de messages de débogage imprimés. Quelqu'un voit ce qui ne va pas avec ma mise en œuvre des interfaces PropertyChangeSupport et Listener? Je veux imprimer une déclaration de débogage lorsque incrementCounter est appelé ou la valeur des changements secretCounter.

Était-ce utile?

La solution

Je suis assez sûr que le mécanisme de PropertyChangeListener ne fonctionne que si vous définissez les propriétés par les mechanis de PropertyEditor, non pas par des accesseurs

J'essaierais avec AspectJ, mais vous ne pouvez conseiller les appels de méthode, et non pas l'exécution, comme la classe tierce partie est définitive.

Autres conseils

Je suis désolé de dire cela, mais dans le cas de cette mise en œuvre de MysteryClass et si vous n'êtes pas en mesure de changer de mise en œuvre vous ne pouvez pas et par la façon dont vous avez obtenu le concept de PropertyChangeListener PropertyChangeSupport tout wrong. pour le faire fonctionner PropertyChangeSupport MysteryClass voir le Java Beans Tutoriel sur les propriétés Bound ce que vous pouvez faire est d'envelopper la classe avec votre propre classe permet MysteryClassWithPrint de dire qui mettra en œuvre toutes les méthodes publiques que la délégation de l'instance interne des MysteryClass et des messages d'impression puis remplacer tous new MysteryClass(); avec le nouveau MysteryClassWithPrint();

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top