【问题标题】:Can't update a class method with javassist无法使用 javassist 更新类方法
【发布时间】:2020-11-08 15:58:59
【问题描述】:

我正在使用 javassist(稍后在项目中使用它),但我无法对类进行简单的更新。 我尝试在方法之前插入代码,但它没有被执行。

我有一个 gradle 项目,我正在使用 javassist 版本:'3.27.0-GA'。

给定以下类:

public class Dummy{
    public int dummy(){
            return 5;
        }
}

以下测试失败,所以类没有被修改:

@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());
}

我错过了什么?

【问题讨论】:

    标签: javassist


    【解决方案1】:

    我的猜测是当你打电话给new Dummy().dummy()

    assertEquals(3, new Dummy().dummy());
    

    类加载器加载Dummy类的原始版本。

    由于要加载/使用CtClass实例cc所代表的修改版本,可以在assertEquals之前插入以下sn-p,使类加载器加载修改后的 版本的 Dummy 类代替:

    cc.toClass();
    

    那么断言应该是成功的。

    请注意,为了使用上面的toClass(),我们依赖于在toClass() 调用之前从未加载过 Dummy 类的事实。 (否则会抛出异常,类加载器不能同时加载同一个类的两个不同版本)

    您可以查看 javassist 文档以获取更多详细信息。这部分可能特别有用http://www.javassist.org/tutorial/tutorial.html#load

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多