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

Posted

技术标签:

【中文标题】是否可以覆盖 Random 类的 Java 实现?【英文标题】:Is it possible to override a Java implementation of the Random class? 【发布时间】:2010-01-27 16:37:26 【问题描述】:

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

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

【问题讨论】:

你不能创建自己的类吗? 如果我是正确的:你不是在问你是否可以从类继承,而是重定向对它的调用,这样对 Random.next() 的调用将调用你的方法而不是默认一个?如果是这样,不,没有办法做到这一点,也永远不会这样做;这将是一个巨大的安全漏洞...... 你不能只传递你自己的种子吗? BlueRaja,AOP 处理器不会允许您进行运行时字节编织以拦截您想要的任何类型的调用吗? 【参考方案1】:

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

【讨论】:

以上是关于是否可以覆盖 Random 类的 Java 实现?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Random类和日期操作类

java多态的实现机制

是否有 PyObject 类的实现允许您正确覆盖魔术方法?

重写java类的equals()和hashCode方法

多态实现的机制

java 当一个接口被多个类继承时 如何知道是调用的哪个类的实现