千葉 滋氏(東京工業大学・大学院情報理工学研究科 )開発
バイトコード(クラスファイル)を直接操作することのできるライブラリ.
これはどういうことかと言うと,普段プログラムを作る際には,Javaプログラム(*.java)をコンパイルし,クラスファイル(*.class)を得る.これをJAVA VM上にロードすることにより実行する.
Javassistでは,プログラムを変更することなく(また,コンパイルすることなく)クラスファイルを操作することができる.
例として,何の機能を持たないA.javaを用意する.
[A.java]
public class A{
}
A.javaをコンパイルしたA.classはこのようになる.(実際はバイトコードなので見ることはできない)
[A.class(編集前)]
public class A extends java.lang.Object{
public A();
}
このA.classに対し,Javassistを用いたMain.javaにて編集を行ってみる.
[Main.java]
import javassist.*;
public class Main {
public static void main(String[] args) throws Exception {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("A");
// フィールドの追加
CtField f1 = CtField.make("int x;", cc);
cc.addField(f1);
// メソッドの追加
CtMethod m = CtNewMethod.make(
"public String toString() {" +
" return \" abcde \"; }", cc);
cc.addMethod(m);
// クラスファイルの更新
cc.writeFile();
}
}
Mainプログラムを動かすとA.classの中身は以下のようになる.
[A.class(編集後)]
public class A extends java.lang.Object{
int x;
public A();
public java.lang.String toString();
}
このようにJavassistを用いることにより,バイトコードにフィールドの追加やメソッドの追加などの処理を行うことができる.
他にも,いろんなことができるみたいなので,↓ページをご覧くらはい.
http://www.csg.is.titech.ac.jp/~chiba/notes/javapress03/index.html
(Javassist -- Java バイトコードを操作するクラスライブラリ -- 入門)