gpt4 book ai didi

java - 为什么在使用 Javassist 更改方法主体后必须调用 .toClass()?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:54:20 25 4
gpt4 key购买 nike

我通过 Javassist 修改我的 TestClassgetMessage() 方法体,如下所示:

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

最佳答案

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

如果不执行toClass(),则字节码的变化不会被编译到类中,new TestClass()会从类路径触发类加载.

关于java - 为什么在使用 Javassist 更改方法主体后必须调用 .toClass()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7385789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com