javassist static初期化を利用して、クラスの振る舞いを変えてます。 2007/11/22

javassistを使ったサンプルです。

static初期化を利用して、クラスの振る舞いを変えてます。
static { }
が実行されると、その後で対象のクラスをnewしても変更が効いてますね。
クラスローダーは意識してませんが。。。

package t;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class Test {

/*
* !!!! static !!!!
*/
static {
ClassPool cp = ClassPool.getDefault();
CtClass cc = null;
try {
cc = cp.get("t.Hello");
CtMethod m = cc.getDeclaredMethod("say");
m.insertBefore("{ System.out.println(\"o_o! Hello.say():\"); }");
// freeze!!
Class c = cc.toClass();

} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}

}

public static void main(String[] args) throws Exception {
Hello h = new Hello();
h.say();
}

}

class Hello {
public void say() {
System.out.println("Hello");
}
}

: