无法使用 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.