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