はじめての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)に放り込んじゃうなら使えないことないかもね。
テストはできないけど・・・。