2008年4月12日土曜日

Javassist

このエントリーをはてなブックマークに追加

千葉 滋氏(東京工業大学・大学院情報理工学研究科 )開発

バイトコード(クラスファイル)を直接操作することのできるライブラリ.

これはどういうことかと言うと,普段プログラムを作る際には,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 バイトコードを操作するクラスライブラリ -- 入門)