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
}

サード パーティの 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

申し訳ありませんが、そのMysteryClass実装の場合、その実装を変更できない場合はできません。ちなみに、PropertyChangeListenerPropertyChangeSupportの概念はすべて間違っています。それを機能させるには、PropertyChangeSupportMysteryClassを参照してください。バインドされたプロパティに関するJavaBeansチュートリアルを参照 してください。クラスを独自のクラスでラップすると、すべてのパブリックメソッドをMysteryClassの内部インスタンスへの委任として実装し、メッセージを出力します。すべてnew MysteryClass();を新しいものに置き換えます MysteryClassWithPrint();

于 2011-01-03T22:06:28.517 に答える
0

ゲッターやセッターではなくPropertyChangeListener、メカニズムを介してプロパティを設定した場合にのみメカニズムが機能すると確信していますPropertyEditor

おそらくAspectJで試してみますが、サードパーティのクラスは最終的なものであるため、実行ではなくメソッド呼び出しのみをアドバイスできます。

于 2011-01-03T21:57:28.930 に答える