无法使用 javassist 更新 class 方法
Can't update a class method with javassist
我正在玩 javassist(稍后在项目中使用它)但我无法对 class 进行简单的更新。
我尝试在方法之前插入代码,但它没有被执行。
我有一个 gradle 项目,我正在使用 javassist 版本:'3.27.0-GA'。
给出以下 class:
public class Dummy{
public int dummy(){
return 5;
}
}
以下测试失败,因此 class 未被修改:
@Test
public void modifyReturnValueTest() throws NotFoundException, CannotCompileException, IOException {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Dummy");
CtMethod m = cc.getDeclaredMethod("dummy");
m.insertBefore("{ if(true) return 3; }");
cc.writeFile();
assertEquals(3, new Dummy().dummy());
}
我错过了什么?
我的猜测是,当您在
中调用 new Dummy().dummy()
时
assertEquals(3, new Dummy().dummy());
class 加载程序加载 Dummy
class 的原始版本。
由于您想要 load/use 您修改的由 CtClass
实例 cc
表示的版本,您可以在 assertEquals
之前插入以下代码片段以使 class 加载程序加载 修改后的 版本的 Dummy
class 而不是:
cc.toClass();
那么断言应该是成功的。
请注意,为了使用上面的 toClass()
,我们依赖于在 toClass()
调用之前从未加载 Dummy class 的事实。 (否则会抛出异常,class加载器不能同时加载同一个class的两个不同版本)
您可以查看 javassist 文档以获取更多详细信息。此部分可能特别有用 http://www.javassist.org/tutorial/tutorial.html#load.
我正在玩 javassist(稍后在项目中使用它)但我无法对 class 进行简单的更新。 我尝试在方法之前插入代码,但它没有被执行。
我有一个 gradle 项目,我正在使用 javassist 版本:'3.27.0-GA'。
给出以下 class:
public class Dummy{
public int dummy(){
return 5;
}
}
以下测试失败,因此 class 未被修改:
@Test
public void modifyReturnValueTest() throws NotFoundException, CannotCompileException, IOException {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Dummy");
CtMethod m = cc.getDeclaredMethod("dummy");
m.insertBefore("{ if(true) return 3; }");
cc.writeFile();
assertEquals(3, new Dummy().dummy());
}
我错过了什么?
我的猜测是,当您在
中调用new Dummy().dummy()
时
assertEquals(3, new Dummy().dummy());
class 加载程序加载 Dummy
class 的原始版本。
由于您想要 load/use 您修改的由 CtClass
实例 cc
表示的版本,您可以在 assertEquals
之前插入以下代码片段以使 class 加载程序加载 修改后的 版本的 Dummy
class 而不是:
cc.toClass();
那么断言应该是成功的。
请注意,为了使用上面的 toClass()
,我们依赖于在 toClass()
调用之前从未加载 Dummy class 的事实。 (否则会抛出异常,class加载器不能同时加载同一个class的两个不同版本)
您可以查看 javassist 文档以获取更多详细信息。此部分可能特别有用 http://www.javassist.org/tutorial/tutorial.html#load.