4

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

4

1 回答 1

7

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

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

于 2011-09-12T09:42:53.317 回答