かとじゅんの技術日誌

技術の話をするところ

MethodInvoker

org.seasar.chronos.delegate.MethodInvokerは,.NETのデリゲートのような機能を提供します.
材料は,ExecutorServiceと,S2に登録されているコンポーネントです.使い方はこんな感じ.

C#ではデリゲートをよく使っていたのですが,Javaでは使えません.しかしながら、リフレクションをうまく使えば同じようなことはできるのでそのようなものを作りました。
デリゲートが完了したときに呼ばれるコールバックですが,通常の方法ならインターフェイスが必ず必要になるのですが,それだといちいちクラスを作らないといけないのでコードが減らせません.
なので,ここでもリフレクションを使って,文字列で指定したメソッドをコールバックします.(ミスタイプするとランタイム例外になりますが、それは割り切りで)

beginInvokeはAsyncResultを返すのですが,完了を待つにはAsyncResult#waitOneか,#isCompletedが使えます.
もしくは,beginInvokeにしてしたコールバックが使えます.コールバックは完了後に呼ばれます.

public Hoge{

    public String hoge(){
        return "hoge";
    }

}

public class Fuga {

    private MethodInvoker mi = null;

    private void MetodInvokerTest(){

        ComponentDef def = s2Container.getComponentDef(Hoge.class);

        mi = new MethodInvoker(Executors.newCachedThreadPool(), componentDef);

        // Hoge#hogeが非同期に実行されます.
        mi.beginInvoke("hoge", new MethodCallback(this, "callback"), null);

    }

     // Hoge#hogeが完了したら呼ばれるコールバック
    private void callback(AsyncResult ar){

       // 戻り値を取得します.
       String result = (String)mi.endInvoke(ar);
       System.out.println(result);

    }

}