Почему я должен вызывать .toClass () после изменения тела метода с помощью Javassist? - PullRequest
3 голосов
/ 12 сентября 2011

Я изменяю 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());

Хорошо работает. Однако, если я удалю вызов метода ctClass.toClass(), подстановка тела не будет работать. Почему?

Как правильно заменить тело моего метода getMessage()? Я правильно делаю?

1 Ответ

6 голосов
/ 12 сентября 2011

A ClassPool содержит CtClass объекты - они представляют классы, но они не Java-классы.Методы toClass() преобразуют CtClass экземпляры в классы Java и фактически загружают класс.

Если вы не выполните toClass(), то изменения в байтовом коде не будут скомпилированы в класс, а new TestClass()вызовет загрузку классов из пути к классам.

...