5

別の大きな Java プログラムのプラグインを作成しています。

実行時に Java プログラムの一部の Java メソッドの一部のバイト コードを変更して、メソッド呼び出しをインターセプトできるようにしたい (つまり、フック コードをメソッドに挿入する)。

これを達成する方法はありますか?

PS:

次のアプローチを確認しました。

1.Java プログラムのクラスローダを変更します。(変更できません)
2.Java プロキシを使用します。(Java プロキシは新しいプロキシ オブジェクトを作成するため、Java プロキシは使用できません。プロキシ オブジェクトは使用しません。Java プログラムのオブジェクトをフックする必要があり、そのオブジェクトを使用する必要があります)
3. -javaagent オプションを使用します (追加できません)。 Java プログラムのコマンドライン オプション)。

PS 詳細[再編集] :
私のクラスは ext クラス ローダーによってロードされました (JAVA_HOME\lib\ext フォルダーに jar ファイルを置きました)。大きな Java プログラムは、ブラウザによってロードされるアプレット プログラムです。ブラウザがアプレットを起動すると、クラスも読み込まれます。

PS more more [再編集] :
アプレットで実行されていますが。私は完全な許可を得ることができます。java.policy と java.security ファイルを変更できるためです。

ありがとう、
カルビン

4

4 に答える 4

6

実行時にバイトコードを変更するために使用される -javaagent オプションを使用するだけです。-javaagent の詳細については、このリンクまたはこのリンクを参照してください。

于 2013-10-09T09:59:50.253 に答える
0

申し訳ありませんが、これは不可能です。まず、バイトコードはクラスロード後に不変です。JVM は、このようなことを行うために使用できるいくつかの API を提供しますが、それらは明らかに非常に特権的です。

ブラウザ アプレットのような権限の低い環境で実行している場合、これを実行することは明らかに許可されません。また、実行できる方法はすべて、セキュリティ上の脆弱性と見なす必要があります。

しかし問題は、そもそもなぜアプレットを使用しているのか、そしてロード後にコードを変更したいのかということです。あなたがやろうとしていることを行うためのより良い方法がほぼ確実にあります。

于 2013-10-09T13:29:35.553 に答える