Re:Javassist 2.5.1 Released

Tutorialを読んで、なぜJavassistBCELより便利なのかがすぐにわかりました。
BCELJavaバイトコードアセンブラなのに対してJavassist高級言語です。つまり、Javassistでは、コードを修正するときに直接バイト配列を指定するだけではなく、Javaソースコード片を指定することもできるのです。次のコードはPoint.move()の先頭にプリント文を挿入する例です。

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Point");
CtMethod m = cc.getDeclaredMethod("move");
m.insertBefore("{ System.out.println($1); System.out.println($2); }");
cc.writeFile();

同じことをBCELでやろうとしたら、push, push, invokeのようなバイトコードレベルの操作をBCELAPIで書くことになるでしょう。Javassistには、他にも便利なAPIを備えていて、フィールドの追加やメソッドの置き換えが簡単にできるようになっています。