2

C++でWindowsDetoursを使用すると、元の関数呼び出しを変更せずに、Windowsの基本機能をインターセプトしてカスタム結果セットを返すことができるように、関数呼び出しをトランポリンすることが可能であることがわかりました。

自分の結果セットを実装するために、Javaランダム化呼び出しをオーバーライドする方法があるかどうか疑問に思いました。前の質問で、C#にJavaランダム化関数を模倣させる方法があるかどうか尋ねました。考えられる解決策として、他の質問を乱雑にすることなく、「迂回のような」ソリューションを実装した経験がある人がいるかどうかを知りたいと思いました。

4

1 に答える 1

4

java.util.Randomオブジェクトのインスタンス化を担当している場合は、代わりにjava.util.Randomをサブクラス化して、独自のクラスをインスタンス化できます。変更できない他のコードがインスタンス化の原因である場合は、明らかに独自のサブクラスを使用できません。あなたの場合、これは選択肢ではないと思います。

もう1つの方法は、クラスのロード時に実装を変更することです。基本的に、java.util.Randomのバイトコードを書き直して、デフォルトで実行する以外のことを実行します。これの欠点は、変更する可能性のある1つのインスタンスだけでなく、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();
于 2010-01-27T16:50:28.040 に答える