問題タブ [java-bytecode-asm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
596 参照

java-bytecode-asm - Javaで実行時に余分なコードを追加する

ライブラリを開発しており、実行時にオブジェクトのメソッドの一部にコードを追加する必要があります。ここには2つのポイントがあります。まず第一に、余分なコードを追加したかったプログラムは、他の誰かによって以前に書かれており、編集したくありませんでした。第二に、私の仕事は、メソッドを呼び出す前にアスペクトを追加することに非常に似ています。

インターネットで検索して読んだ後、この仕事を行うことができるaspectj、ASPECTWERKZなどの多くのフレームワークを見つけましたが、たとえば、aspectj(春のコンテキストで使用する場合)の問題は、APIを提供しないことです実行時にウィービングを行います。また、ASM や javassist などのようなライブラリがいくつかあることもわかりましたが、それらは非常に一般的で習得が難しく、私の仕事はアスペクトの可能性が高いです。

それで、あなたは何を提案しますか?そこに良いライブラリはありますか?先ほど言及した上記のライブラリについて間違っていますか? 助けてください!

0 投票する
1 に答える
5185 参照

java - ASMを使用して初期化子で静的最終フィールドを追加するには?

ASM を使用して static final フィールドを .class ファイルに追加したいのですが、ソース ファイルは

逆コンパイルされて生成されたクラスは次のようになります。

結論として、ASM を使用して .class ファイルに FIRST および SECOND 定数を追加したいのですが、どうすればよいですか?

0 投票する
1 に答える
702 参照

java - ASM を使用して Java クラス ファイル内のメソッドから別のメソッドにオペコードをコピーするにはどうすればよいですか?

ここにいくつかのコードがあります。

これら 2 つのメソッドは同等のアクションを実行します。最初のメソッドの 2 番目のパラメータは疑似引数なので、元のコードをクリアして、このメソッドを次のようにしたいのですが...

どうすればこのアクションを実行できますか? 私はこのようにしてみました。

ただし、null ポインター例外がスローされます。理由は何ですか?

0 投票する
2 に答える
4435 参照

java - メソッドのローカル変数の型が正しくありません

ASM 4 を使用して、その場でいくつかのクラスを生成しています。例外処理を行うコードを生成するまでは、すべてうまくいきました。生成されたバイトコードは一番下にあります。これが私が得ているエラーです:

バイトコードは次のとおりです。

ASMifier を使用してこれを開始しました。

しかし、それを一般化するために変更する必要がありました。以下は、try/catch 部分を生成するコードです。

0 投票する
1 に答える
1099 参照

bytecode - ASM の Class Verifier (org.objectweb.asm.util.CheckClassAdapter) を使用したクラス検証中の ClassNotFound エラー

ASM のクラス Verifier を使用して検証しようとしているバイトコードのスニペットを次に示します。

これは、より大きなクラス org/apache/xerces/impl/io/UTF8Reader の一部です。ここで、ASM が提供する Class verifier を介してこのクラスのバイトコードを実行すると、次の結果が得られます。

私はこの最後のビットに非常に混乱しています... なぜ org/apache/xerces/util/MessageFormatter オブジェクトの 7 行目で ClassNotFound 例外を出すのですか?

ありがとう。

0 投票する
2 に答える
2650 参照

java - Javaは、.classのインポートが何であるかを調べます

クラスにどのようなインポートがあるかを調べる方法はありますか?

この質問では:Jon Skeetはリフレクションを使用してこれを行うことはできないと言っていますが、

コンパイルされたコード内で使用されているすべてのタイプを検索したい場合、それは少し異なる問題です。バイトコードを分析する方法としてBCELを検討することをお勧めします。

これが私が知りたいことです。

0 投票する
3 に答える
1910 参照

java - asm ライブラリを使用してインストルメント化するメソッドで空のローカル変数を見つける方法

さまざまなメソッドのクラスをインストルメント化するときに、メソッドにテキスト ファイルへの書き込み操作を実行させるため。最初に、明示的に定義されたローカル変数 3160 に文字列を格納しました。既存の変数との競合を防ぐためにこれらの変数を選択する方法。

このスニペットのように、コードはメソッドに入るたびにクラス名をテキスト ファイルに書き込む作業を行います。そのためには、変数 3160 を使用して文字列 s をスタックにロードする必要がありました (既に定義されている変数名が変数 s (3160) と競合しないように、値は大きく保たれます。私の質問は、メソッドでローカル変数を定義する方法です。 ASM ライブラリを使用したインストルメンテーション中 この質問は時期尚早に思えるかもしれませんが、それは私が初心者だからです。

0 投票する
2 に答える
14941 参照

java - JavaASMバイトコードの変更-メソッド本体の変更

自分のボディと交換したいjarのクラスのメソッドがあります。この場合、メソッドに「GOT IT」をコンソールに出力して、trueを返したいだけです。

システムローダーを使用してjarのクラスをロードしています。リフレクションを使用して、システムクラスローダーがバイトコードでクラスをロードできるようにしています。この部分は正しく機能しているようです。

私はここにあるメソッド置換の例に従っています:asm.ow2.org/current/asm-transformations.pdf。

私のコードは次のとおりです。

問題はmv.visitMethodInsn(access, cname, newName, desc);内部generateMethodBodyにあるようMethodReplacerです。

「定数プールのタイプが不正です」というエラーが発生します。

何が欠けているのかわかりません...しかし、約3日間読んでテストした後でも、まだどこにも行きません。

[編集]

ご参考までにtmcore、弁護士向けのシングルプレイヤー「異議」ゲームです。私はそれを楽しむためにこれをやっています。プログラムはゲームを正常に起動し、すべてが正常です。から変更を削除するMethodReplacerと、ゲームは設計どおりに動作します。したがって、この問題は、メソッド置換の内部での私による不正なバイトコード/変更に限定されているようです。

[編集2]

CheckClassAdapter.verify(cr, true, pw);関数が編集前に持っているはずのバイトコードとまったく同じバイトコードを返します。まるで変更が行われていないかのようです。

[編集3]

classtoloadコメントごとにコメントアウトされたコピー

0 投票する
1 に答える
3328 参照

java - 空のスタックからオペランドをポップできません

ASM 4 を使用しています。別の言語からオンザフライでバイトコードを生成しています。以下を生成していますが、何が起こっているのかわかりません。私の推測では、try/catch ブロックがスタックに干渉していると思われます。最初の 2 行は Lambda2 をロードしています。これは最後にスタックの最も深い項目である必要がありますが、途中でそれが消えている理由がわかりません。

命令 13 でスタックが消えるようです。ここで、try/catch ブロックに入ります。スタックは、try/catch ブロックに入ると捨てられますか? もしそうなら、それは問題を説明するでしょう。