2 Stimmen

Ist es möglich, eine Java-Implementierung der Klasse Random außer Kraft zu setzen?

Verwendung von Fenster Umwege in C++ habe ich gesehen, dass es möglich ist, Funktionsaufrufe zu trampeln, so dass Sie die Windows-Basisfunktionalität abfangen und benutzerdefinierte Ergebnissätze zurückgeben können, ohne den ursprünglichen Funktionsaufruf zu ändern.

Ich habe mich gefragt, ob es eine Möglichkeit gibt, einen Java-Randomisierungsaufruf zu überschreiben, so dass ich meine eigene Ergebnismenge implementieren kann. In einer früheren Frage, Ich habe gefragt, ob es eine Möglichkeit gibt, die Java-Randomisierungsfunktion in C# nachzubilden . Als mögliche Lösung, ohne die andere Frage zu überlagern, wollte ich wissen, ob jemand Erfahrung mit der Umsetzung einer "umleitungsähnlichen" Lösung hat.

4voto

liwp Punkte 6536

Wenn Sie für die Instanziierung eines java.util.Random-Objekts verantwortlich sind, können Sie java.util.Random unterklassifizieren und stattdessen Ihre eigene Klasse instanziieren. Wenn ein anderer Code, den Sie nicht ändern können, für die Instanziierung verantwortlich ist, können Sie natürlich nicht Ihre eigene Unterklasse verwenden. Ich nehme an, dass dies in Ihrem Fall keine Option ist.

Eine weitere Alternative besteht darin, die Implementierung zum Zeitpunkt des Ladens der Klasse zu ändern. Im Grunde schreiben Sie den Bytecode von java.util.Random so um, dass er etwas anderes tut als das, was er standardmäßig tut. Der Nachteil dabei ist, dass sich dies auf alle Instanzen von java.util.Random auswirkt, nicht nur auf die eine Instanz, die Sie vielleicht ändern möchten. Andererseits ist der meiste Code nicht auf die Implementierungsdetails des RNG angewiesen, so dass dies wahrscheinlich kein Problem darstellt.

Javassist ist eine sehr schöne Bytecode-Bibliothek. Sie ermöglicht es Ihnen, Bytecode beim Laden der Klasse umzuschreiben, so dass Sie z. B. den Körper der Methode, die die Zufallszahl erzeugt, durch einen Aufruf Ihrer eigenen Klasse ersetzen können, die den benötigten RNG-Algorithmus implementiert.

Sie könnten einen einfachen Klassendateiprozessor schreiben, der für die Klasse java.util.Random ausgeführt wird. Der Code könnte etwa so aussehen:

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();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X