次のクラスは、インスタンスと呼び出すメソッド名を入力として受け取るTimerTask
( )の拡張機能を使用して機能します。MethodTimerTask
Foo
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 を返します。methodName
Foo