Re:Javassist 2.5.1 Released
Tutorialを読んで、なぜJavassistがBCELより便利なのかがすぐにわかりました。
BCELがJavaバイトコードのアセンブラなのに対して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のようなバイトコードレベルの操作をBCELのAPIで書くことになるでしょう。Javassistには、他にも便利なAPIを備えていて、フィールドの追加やメソッドの置き換えが簡単にできるようになっています。