Question

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?

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top