在 C++ 中使用Windows Detours,我已经看到可以实现函数调用,以便您可以拦截 Windows 基本功能并返回自定义结果集,而无需修改原始函数调用。
我想知道是否有任何方法可以覆盖 Java 随机化调用,以便我可以实现自己的结果集。在上一个问题中,我问是否有任何方法可以让 C# 模仿 Java 随机化函数。作为一种可能的解决方案,在不混淆其他问题的情况下,我想知道是否有人在实施“类似迂回”的解决方案方面有任何经验。
在 C++ 中使用Windows Detours,我已经看到可以实现函数调用,以便您可以拦截 Windows 基本功能并返回自定义结果集,而无需修改原始函数调用。
我想知道是否有任何方法可以覆盖 Java 随机化调用,以便我可以实现自己的结果集。在上一个问题中,我问是否有任何方法可以让 C# 模仿 Java 随机化函数。作为一种可能的解决方案,在不混淆其他问题的情况下,我想知道是否有人在实施“类似迂回”的解决方案方面有任何经验。
如果您负责实例化 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();