サードパーティのクラス ファイル (私が書いていないクラス) をロードして実行する Java プログラムがあります。これらのクラスはjava.util.Random
、デフォルトで、インスタンス化されるたびにランダムな開始シード値を生成する を使用することがよくあります。再現性の理由から、これらのクラスには毎回同じ開始シードを与え、私の裁量でのみ変更したいと考えています。
明らかな解決策のいくつかと、それらが機能しない理由を次に示します。
サードパーティのクラスファイルで別のランダム クラスを使用します。ここでの問題は、クラス ファイルをロードするだけで、ソースを変更できないことです。
カスタム クラスローダーを使用して、JVM のバージョンの代わりに独自の Random クラスをロードします。
java
Java ではクラスローダーがパッケージ内のクラスをオーバーライドできないため、このアプローチは機能しません。rt.jar の
java.util.Random
実装を独自のものに交換するか、ファイルを JVM の信頼できる場所に置きます。これらのアプローチでは、アプリケーションのユーザーが自分のマシンにインストールされている JVM をいじる必要があり、役に立ちません。bootclasspath にカスタム
java.util.Random
クラスを追加します。これは技術的には機能しますが、この特定のアプリケーションでは、このアプリケーションはエンド ユーザーが IDE から実行することを目的としているため、実用的ではありません。アプリをユーザーにとって便利に実行できるようにしたいので、ブートクラスパスを強制的に設定するのは面倒です。これは、Eclipse などの IDE から実行することを目的としているため (デバッグを容易にするため)、スクリプトで非表示にすることはできません。
では、どうすればこれを行うことができますか?