问题
I modify getMessage()
method body of my TestClass
by Javassist like this:
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());
It works well. However, if I remove the ctClass.toClass()
method call, the body substitution doesn't work. Why?
How should I correctly replace the body of my getMessage()
method? Am I doing it right?
回答1:
A ClassPool
contains CtClass
objects - they represent classes but they are not java classes. The toClass()
methods convert CtClass
instances into java classes and actually load the class.
If you do not execute toClass()
, then the byte code changes will not be compiled into the class and new TestClass()
will trigger a classload from the classpath.
来源:https://stackoverflow.com/questions/7385789/why-do-i-have-to-call-toclass-after-changing-a-method-body-with-javassist