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

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

 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()方法的主体? 我做得对吗?

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

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