はじめてのJavassist

動的に生成されたBeanを使って、DBの検索結果を受け取ってやろうと思って、
Javassistを使用してみました。

参考にしたのはここ。
SMG Javassistチュートリアル
http://www.smg.co.jp/seminar/techsquare/javassist01.html

// 新規Bean作成
ClassPool pool = ClassPool.getDefault();
CtClass bean = pool.makeClass("Result");
 
// フィールド(ID)の追加
CtClass integer = pool.get("java.lang.Integer");
CtField f = new CtField(integer, "id", bean);
bean.addField(f);

// メソッド(IDのアクセサ)追加
CtMethod m = CtNewMethod.make(
            "public Integer getId() { return id; }", bean);
bean.addMethod(m);
m = CtNewMethod.make(
            "public void setId(Integer id) { this.id = id; }", bean);
bean.addMethod(m);

// 実際にBeanを生成してメソッドを実行してみる
Class beanClass = bean.toClass();
Object beanObj = beanClass.newInstance();

// setId(new Integer(10))
Method setIdMethod = beanObj.getClass().getMethod("setId", new Class {Integer.class});
setIdMethod.invoke(beanObj, new Object {new Integer(10)});

// getId()
Method getIdMethod = beanObj.getClass().getMethod("getId", new Class {});
Object retObj = getIdMethod.invoke(beanObj, new Object{});

// get id result = 10が出力される
System.out.println("get id result =" + retObj);

結果はMapを使うのとあんまり変わらないので微妙な感じです。
Javassistが簡単に使えるってことがわかったのでよしとします。
結果セットをJavaコード中で扱わずに、すぐにスクリプト言語の世界(JSP/Velocity/Groovy)に放り込んじゃうなら使えないことないかもね。
テストはできないけど・・・。