Ich habe ein Java-Programm, das Third Party Class-Dateien (Klassen, die ich nicht geschrieben habe) lädt und führt sie aus. Diese Klassen verwenden häufig java.util.Random
, die bei jeder Instanziierung standardmäßig zufällige Anfangswertwerte generiert. Aus Gründen der Reproduzierbarkeit möchte ich diesen Klassen jedes Mal den gleichen Anfangskorn geben und sie nur nach meinem Ermessen ändern.Wie kann ich java.util.Random einen bestimmten Startwert in Drittklassen geben?
Hier sind einige der offensichtlichen Lösungen, und warum sie nicht funktionieren:
Verwenden Sie eine andere Zufallsklasse in den Klassendateien von Drittanbietern. Das Problem hier ist, ich lade nur die Klassendateien und kann die Quelle nicht ändern.
Verwenden Sie einen benutzerdefinierten Classloader zum Laden unserer eigenen Random-Klasse anstelle der JVM-Version. Dieser Ansatz wird nicht funktionieren, da Java es ClassLadern nicht erlaubt, Klassen im
java
-Paket zu überschreiben.Tauschen Sie die Implementierung
java.util.Random
von rt.jar aus, oder legen Sie Dateien in vertrauenswürdige Speicherorte für die JVM. Diese Herangehensweisen erfordern, dass der Benutzer der Anwendung mit der JVM-Installation auf seinem Computer herumhängt und nicht gut ist.Hinzufügen einer benutzerdefinierten Klasse
java.util.Random
zum bootclasspath. Während dies für diese spezielle Anwendung technisch funktionieren würde, ist es unpraktisch, da diese Anwendung für Endbenutzer von einer IDE ausgeführt werden soll. Ich möchte die App für Benutzer bequemer machen, was bedeutet, dass sie gezwungen sind, ihren Bootclasspath einzustellen. Ich kann dies in einem Skript nicht verstecken, denn es bestimmt ist von einem IDE wie Eclipse ausgeführt werden (für eine einfache Fehlersuche.)
So wie kann ich das tun?
Cha Der bootclasspath ist zwar effektiv, erfordert jedoch eine Änderung der Ausführung des Java-Programms. Dies ist in Ordnung, wenn Sie steuern können, wie jemand das Programm startet, z. ein Startskript, aber in meinem Fall laufen Benutzer normalerweise innerhalb einer IDE und würden es manuell tun müssen, was nicht gut ist. – adum