javassist static初期化を利用して、クラスの振る舞いを変えてます。
2007/11/22
java
javassist
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");
}
}
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");
}
}
: