0

現在、私はプロジェクトに取り組んでおり、セットアップは次のようになっています。クラス(Foo)があり、その中にいくつかのメソッドがあり、メインクラスによって異なる時間にアクティブ化する必要があります。

私はこれをかなり長い間研究してきました、そして私が見つけることができる唯一のことはTimerクラスです、それは一見クラスの時間しかできないので、うまくいきません、そして私はそのようなために25の異なるクラスを望んでいません基本的なプログラム。

Foo各メソッドを個別にアクティブ化するにはどうすればよいですか?

4

1 に答える 1

1

次のクラスは、インスタンスと呼び出すメソッド名を入力として受け取るTimerTask( )の拡張機能を使用して機能します。MethodTimerTaskFoo

TimerTaskこのように、リフレクションを使用すると、1 つの拡張クラスだけでさまざまなメソッドをさまざまなタイミングで呼び出すことができます。

public class MyTimerTaskExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Timer timer = new Timer();
        Foo foo = new Foo();
        timer.schedule(new MethodTimerTask(foo, "method1"), 1000);
        timer.schedule(new MethodTimerTask(foo, "method2"), 3000);
    }

    public static class MethodTimerTask extends TimerTask {

        private String methodName;
        private Foo fooInstance;
        private Exception exception;

        public MethodTimerTask(Foo fooInstance, String methodName) {
            this.methodName = methodName;
            this.fooInstance = fooInstance;
        }

        @Override
        public void run() {
            try {
                Foo.class.getMethod(methodName).invoke(fooInstance);
            } catch (Exception e) {
                this.exception = e;
            }
        }

        public Exception getException() {
            return exception;
        }

        public boolean hasException() {
            return this.exception != null;
        }

    }

    public static class Foo {

        public void method1() {
            System.out.println("method1 executed");
        }

        public void method2() {
            System.out.println("method2 executed");
        }

    }

}

おまけ: このメソッドは、の実行中にgetException()キャッチされた最終的な Exception を返します。methodNameFoo

于 2012-11-16T04:16:03.027 に答える