レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

Java with CGLIB でC#ライクなDelegateを使う(2)

昨日の日記(Java with CGLIB でC#ライクなDelegateを使う。)の続きで、ちょっとサンプルを作ってみる。

Delegateでオブジェクトメソッドの列挙フレームワークを作る。

(実はそんな大げさなもんではありませんが)


オブジェクトのメソッドをループする部分(MethodProcesser)を
フレームワークとして作っておきDelegateを使って処理を呼び出し元に委譲しておく。
これで、メソッド毎の処理を呼び出し元で切り替えることが可能となる。

配管的処理をMethodProcesser側でもちょっと増やしてやれば意義がでてくる。

Start.java

import java.lang.reflect.Method;
import net.sf.cglib.reflect.MethodDelegate;

public class Start{
    public static void main(String args[]){
        // 処理対象のオブジェクトを作成する
        Human h =new Human();
        h.setName("foo"); // このサンプルでは値は関係無いですが、、

        // Delegateを作る。委譲先はこのクラスのスタティックメソッド
        // スタティックメソッドへの委譲は、createStaticを使う。
        EachMethodEventDelegate delegate = 
            (EachMethodEventDelegate)MethodDelegate.createStatic(
                Start.class, "printMethodName", EachMethodEventDelegate.class);

        // フレームワークの起動
        MethodProcesser proc = new MethodProcesser(delegate);
        proc.process(h);
    }
    
    // デリゲートに渡される委譲先メソッド
    public static void printMethodName(Method method){
        System.out.println(method.getName());
    }
}

// メソッド毎の処理を定義するデリゲート
interface EachMethodEventDelegate {
    void doEachMethodEvent(Method method);
}

// 与えられたオブジェクトのメソッドを全てループして
// メソッド毎にDelegateで指定された処理を実行するクラス
class MethodProcesser{
    private EachMethodEventDelegate handler;
    public MethodProcesser(EachMethodEventDelegate delegate){
        this.handler = delegate;
    }
    
    public void process(Object target){
        Method[] methods = target.getClass().getMethods();
        for(Method m : methods){
            //////////////////////////////
            // 委譲先の処理を実行する
            //////////////////////////////
            this.handler.doEachMethodEvent(m);

        }
    }
}


// 対象オブジェクト
class Human{
    private String name;
    public String getName(){
        return this.name;
    }
    public void setName(String paName){
        this.name = paName;
    }
}

実行結果

C:\java>javac -cp cglib-nodep-2.1_3.jar  *.java

C:\java>java -cp .;cglib-nodep-2.1_3.jar Start
getName
setName
hashCode
getClass
wait
wait
wait
equals
notify
notifyAll
toString