昨日の日記(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