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

Mic*_*ian 3 java javassist

我像这样修改getMessage()TestClass的Javassist的方法体:

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());
Run Code Online (Sandbox Code Playgroud)

它运作良好.但是,如果我删除ctClass.toClass()方法调用,则主体替换不起作用.为什么?

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

And*_*s_D 6

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

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