代码之家  ›  专栏  ›  技术社区  ›  George Johnston

重写随机类的Java实现是可能的吗?

  •  2
  • George Johnston  · 技术社区  · 15 年前

    使用 Windows Detours 在C++中,我看到可以调用函数调用,这样就可以在不修改原始函数调用的情况下拦截Windows基础功能并返回自定义的子查询。

    我想知道是否有任何方法可以重写Java随机化调用,这样我就可以实现自己的结果集。在前一个问题中, I asked if there was any way to make C# mimic the Java randomization function . 作为一个可能的解决方案,我想知道是否有人有过实现“迂回式”解决方案的经验,而没有弄乱另一个问题。

    1 回复  |  直到 15 年前
        1
  •  4
  •   liwp    15 年前

    如果您负责实例化java.util.random对象,那么您可以将java.util.random子类化并实例化您自己的类。如果您无法更改的其他代码负责实例化,那么您显然不能使用自己的子类。我想这不是你的选择。

    另一种选择是在类加载时更改实现。基本上,您要重写java.util.random的字节码,以执行默认操作之外的操作。其缺点是它将影响java.util.random的所有实例,而不仅仅是您可能要更改的一个实例。再说一次,大多数代码不依赖于rng的实现细节,所以这可能不是问题。

    Javassist 是一个很好的字节码库。它允许您在类加载时重写字节码,这样您就可以,例如,用调用实现所需rng算法的自己的类来替换生成随机数的方法体。

    您可以编写一个简单的类文件处理器,它将为java.util.random类运行。代码可能是这样的:

    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.get("Random"); // maybe java.util.Random
    CtMethod m = cc.getDeclaredMethod("nextLong");
    m.setBody("my.super.duper.RandomClass.nextLong()");
    cc.writeFile();