为什么在用Javassist更改方法体之后我必须调用.toClass()?

时间:2011-09-12 09:29:06

标签: java javassist

我通过Javassist修改getMessage() TestClass方法体,如下所示:

ClassPool cp = new ClassPool(true);
CtClass ctClass = cp.get("my.test.javassist.TestClass");
CtMethod ctMethod = ctClass.getDeclaredMethod("getMessage");
ctMethod.setBody("{ return \"Hello from javassist\"; }");
ctClass.toClass();

TestClass c = new TestClass();
System.out.println(c.getMessage());

效果很好。但是,如果我删除ctClass.toClass()方法调用,则正文替换不起作用。为什么呢?

我应该如何正确替换getMessage()方法的正文?我做得对吗?

1 个答案:

答案 0 :(得分:6)

ClassPool包含CtClass个对象 - 它们代表类,但它们不是 java类。 toClass()方法将CtClass实例转换为java类并实际加载类。

如果不执行toClass(),则字节代码更改将不会编译到类中,new TestClass()将从类路径触发类加载。