1

私はEclipseアプリケーションに次のコードを持っています:

import org.eclipse.swt.widgets.Listener;
public class X {
  public void test() {
     Listener eclipseListener = new Listener() {
        public void handleEvent(Event evt) {
            System.err.println("starting");
            Y.externalMethod();
            System.err.println("finished");
        }
    }
}

public class Y {
    public static void externalMethod() {
        System.err.println("in class Y");
    }
}

クラス X でメソッド テストを実行すると、次の出力が得られます。

起動

クラス Y で externalMethod が実行されなかった理由と、制御がクラス X に戻されなかった理由がわかりません (「終了」または「クラス Y 内」とは出力されません)。

externalMethod が実行されない理由についてのアイデアはありますか? 匿名の内部クラスは、クラス外で静的メソッドを呼び出すことを許可されていませんか? もしそうなら、なぜこのコードはコンパイルされるのですか?

4

2 に答える 2

1

それ以外の

    public void handleEvent(Event evt) {
        System.err.println("starting");
        Y.externalMethod();
        System.err.println("finished");
    }

あなたはより良い運を持っているかもしれません:

    public void handleEvent(Event evt) {
        System.err.println("starting handleEvent");
        try {
            Y.externalMethod();
        } finally {
            System.err.println("finished handleEvent");
        }
    }

あれは、

  1. メソッド出口トレースを入れるfinally
  2. トレース ラインにメソッド名を追加する
于 2013-02-04T22:41:42.070 に答える
0

メソッドhandleEvent()はここでは呼び出されません。あなたがしたことは、匿名クラスを定義し、その場でインスタンスを作成することです。

このリスナー ( eclipseListener) を、イベントが発生したときにメソッドを呼び出すイベント ハンドラーに登録する必要がありhandleEvent()ます。

于 2013-02-04T22:31:26.317 に答える