是否可以覆盖Random类的Java实现?

时间:2010-01-27 16:37:27

标签: java c++ detours

在C ++中使用Windows Detours,我已经看到有可能对函数调用进行trampoline,这样你就可以拦截windows基本功能并返回自定义结果集,而无需修改原始函数调用。

我想知道是否有任何方法可以覆盖Java Randomization调用,以便我可以实现自己的结果集。在上一个问题中,I asked if there was any way to make C# mimic the Java randomization function。作为一种可能的解决方案,在不弄乱其他问题的情况下,我想知道是否有人在实施“绕道而行”的解决方案方面有任何经验。

1 个答案:

答案 0 :(得分:4)

如果您负责实例化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();