前々からフレームワークとかってどうやってメソッドよんでんのかなーと思っていた。で、噂でしか聞いていないけれど「リフレクション」とよばれるAPIがあるのね。
なぜ、リフレクションに興味がわいたかにはもう一つ理由があって、VO(ValueObject?)とか、StrutsのFormとかって、トレースするときにいちいち「get?」ってやらなければならない。
めんどくさい。
めんどくさいのはいやなので、リフレクションを使い、インスタンスのメソッド名を取ってきてトレースする方法を考えてみた。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/reflect/package-summary.html
メソッド名を取ってくる
メソッドの一覧は以下の方法でとってくることができる。
Method[] methods = obj.getClass().getMethods(); String methodName = method[0].getName();
メソッドを実行する
メソッドを実行する場合はこんな感じ。
method.invoke(obj, new Object[0])
引数がないメソッドを実行するので長さ0の配列を指定している。
オブジェクトが持っている値を表示する方法
メソッド一覧とメソッド実行ができれば、オブジェクトが持っている「ゲットメソッド」の中身を表示するメソッドを作ることができる。
public class MethodTest { public static void main(String[] args) { TestVO vo = new TestVO(); vo.setInteger(new Integer(1)); vo.setIntvalue(10); List list = new ArrayList(); list.add(1); vo.setList(list); vo.setName("name"); trace(vo); } private static void trace(Object obj){ if(obj == null){ //何もしないでおく }else{ traceObject(obj); } } private static void traceObject(Object traceObj){ Method[] methods = traceObj.getClass().getMethods(); for(Method method : methods){ String methodName = method.getName(); if(methodName.startsWith("get")){ //get?のみ表示対象とする try{ Object obj = method.invoke(traceObj, new Object[0]); print(methodName, obj); }catch(InvocationTargetException ite){ }catch(IllegalArgumentException iArgE){ }catch(IllegalAccessException iAccessE){ } } } } private static void print(String methodName, Object value){ System.out.println(methodName + "=" + value); }
実行結果 getIntvalue=10 getName=name getInteger=1 getList=[1] getClass=class com.daipresents.test.reflect.TestVO
再帰的に呼び出して、オブジェクトの中のオブジェクトを表示・・・としようかとおもったけど、危険なので辞めた。