リフレクションを使ってオブジェクトの値を表示

感想おまちしてます!

前々からフレームワークとかってどうやってメソッドよんでんのかなーと思っていた。で、噂でしか聞いていないけれど「リフレクション」とよばれる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

再帰的に呼び出して、オブジェクトの中のオブジェクトを表示・・・としようかとおもったけど、危険なので辞めた。