java - 如何在第三方类中为 java.util.Random 提供特定种子?

标签 java random jvm classloader

我有一个 Java 程序可以加载第三方类文件(我没有编写的类)并执行它们。这些类通常使用 java.util.Random,它在每次实例化时默认生成随机起始种子值。出于可重现性的原因,我想每次都为这些类提供相同的起始种子,仅根据我的判断进行更改。

以下是一些显而易见的解决方案,以及它们为何不起作用:

  1. 在第三方类文件中使用不同的随机类。这里的问题是我只加载类文件,不能修改源。

  2. 使用自定义类加载器加载我们自己的 Random 类,而不是 JVM 的版本。这种方法行不通,因为 Java 不允许类加载器覆盖 java 包中的类。

  3. 将 rt.jar 的 java.util.Random 实现换成我们自己的,或者将文件放入 JVM 的受信任位置。这些方法需要应用程序的用户在他们的机器上安装 JVM,这并不好。

  4. 将自定义 java.util.Random 类添加到引导类路径。虽然这在技术上可行,但对于这个特定的应用程序来说,这是不切实际的,因为这个应用程序旨在让最终用户从 IDE 运行。我想让用户方便地运行应用程序,这意味着强制他们设置他们的 bootclasspath 是一件痛苦的事情。我无法将其隐藏在脚本中,因为它旨在从像 Eclipse 这样的 IDE 中运行(以便于调试。)

那我该怎么做呢?

最佳答案

按照以下说明,您的选项 2 实际上可行。

您将需要(如 anjab 所说)更改 Bootstrap 类路径。

在程序的命令行中,您需要添加以下内容:

java -Xbootclasspath/p:C:\你的\random_impl.jar 你的程序

假设您使用的是 Windown 机器或任何操作系统中与此相关的路径。

该选项在加载 rt.jar 之前添加 jar 文件中的类。因此,您的 Random 将在 rt.jar Random 类之前加载。

通过键入显示用法:

java -X

它显示了 JVM 具有的所有 X(tra) 特性。它可能不可用 在其他 VM 实现(例如 JRockit 或其他)上,但它存在于 Sun JVM 上。

-Xbootclasspath/p: 在bootstrap类路径前面加上

我在一个应用程序中使用了这种方法,其中默认的 ORB 类应该替换为其他 ORB 实现。 ORB 类是 Java 核心的一部分,从来没有任何问题。

祝你好运。

关于java - 如何在第三方类中为 java.util.Random 提供特定种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/106623/

相关文章:

java : cannot set Map field

c - 考虑到每个值都有唯一的对应值,如何随机显示数组中的值?

c++ - Variabel 每次都会给出一个看似随机的答案

Yocto 构建上的 JAVA 安装错误

java - 确定特定循环的 Big(O) 效率

java - 如何根据用户定义的参数执行 throttle ?

java - 具有公共(public)外键的 Hibernate ManyToMany 关系

mysql - RAND() 查询和性能

java - Tomcat 堆空间已满

java - Docker - Java 容器不遵守内存限制