問題タブ [bytecode-manipulation]
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.
java - Java バイトコードエディタ
重複の可能性:
Java バイトコード エディター?
以下の機能を最低限備えた Java バイトコード エディタを探しています。
- GUI - クラスファイルのロードとバイトコードの表示が簡単
- Javaバイトコードを編集して保存
java - バイトコード操作は、実行時にJavaメソッドの戻り型を変更できますか?
私はバイトコード操作でこのようなことをすることが可能かどうか疑問に思いました:
今私は電話したい:
Stringパラメーターのオーバーロードhiメソッドを呼び出します。
java - JavaのDouble Array型の表現方法(逆アセンブルコード修正)
Java 1.7 を使用してコンパイルされた jar に依存するコードがいくつかあります。私は現在、Java 1.6 にしかアクセスできない OSX で作業しています。現在、これらの jar をローカルで再コンパイルしようとしています。ただし、jar ファイルには .class ファイルしか含まれていませんでした。逆アセンブラをダウンロードし、結果の .java ファイルを保存しました。現在、デバッグしようとしているエラーがいくつかあります。ファイルの 1 つは、一部のパラメーターがクラスまたは型と等しいかどうかを確認します。私が抱えている問題は、表現があることです
これはコンパイラエラーを引き起こしています。double 配列クラスを表現する適切な方法は何ですか?
java - javaのバイトオフセットからソースコードの行番号を取得するにはどうすればよいですか?
.class ファイルを操作しています。InstrutionHandleパッケージを使用して、一度に 1 つずつ指示を取得しています。getPosition()メソッドで命令のバイト オフセットを取得しています。バイト オフセットからソース行番号を取得できますか?
java - Java でのプログラム コードの変更 (変数の抽出など)
メソッドの呼び出しやフィールドの値の変更など、Reflection を使用すると便利なことができることはわかっています。ただし、実行時およびプログラムでより重いコード変更を行うことは可能ですか?
たとえば、メソッドがある場合:
このメソッドの内部を変更し、フィールドに定数が割り当てられていることに気づき、それを次のように変更するプログラムを作成できますか?
おそらくJavaは、この種のことを行う言語ではないかもしれません-そうでない場合、基本的にこの方法でコードを再解析または検査し、それを非常に正確に変更できる言語の提案を受け入れます. 私はここで夢物語かもしれませんが、これも当てはまるかどうか教えてください.
java - ASMのJavaメソッドパラメータ値
Javaプログラムのメソッドのパラメータの値を取得しようとしています。ASMを使用してバイトコードを計測し、これらの値を取得しています。しかし、私はいくつかの問題に直面しています。
コードをインストルメント化するために使用されるvisitCode()メソッドは次のとおりです。それがしていることは:
- 収集されたパラメータを格納するための空の配列を作成します。
- パラメータごとに、その値を配列にロードします。
- この配列をエージェントのOnMethodEntryメソッド(値が使用される場所)に送信します。
。
ただし、メソッドに複数のパラメーターがあると思われる場合、これは機能しません。
得られたクラスファイルは次のようなものを示しています:
パラメータをロードする代わりに、2つのローカルオブジェクトが作成されます。
バイトコードは奇妙なことを何も示していません:
そして最後に、表示されるエラーは次のとおりです(-noverifyを使用する場合):
それ以外の場合は、次のとおりです。
通常、スタックフレームから情報をロードしているだけなので、これはむしろ機能するはずです。静的メソッドと非静的メソッドもチェックしようとしましたが(ここで説明されているスタックの時点で:http ://www.artima.com/insidejvm/ed2/jvm8.html )、それでも成功しませんでした。
なぜこれが起こっているのか、あるいは解決策のアイデアはありますか?
ありがとう :)
編集:
プリミティブ型をボックス化するときに機能するようになりました(以下のint3による提案に感謝します:))。これがvisitCode()メソッドの動作コードです:
java - 別のメソッドが呼び出される前に Java メソッドを注入する
私は ASM を使用しており、次のように書き直したいと考えています。
に:
問題は、以前のメソッドが何であるかがわからず、ターゲット メソッドしか知らないことです (そのため、後で見つけsomeMethod()
て注入することはできません)。
また、ターゲット メソッドの多くのバージョンがあり、これを操作するさまざまなパラメーターのセットがあります。
ASM を使用すると、目的のメソッド呼び出しを簡単に見つけることができますが、残念ながらその時点でのオペランド スタックは次のようになります。
そして、インスタンスがどれくらい下にあるのかを理解することはできますが、それを読み取るために挿入できるバイトコードはありません。dup コマンドのトリックを使用して最大 4 つのパラメーターに対して実行できることはわかっていますが、一般的な解決策が必要です。
たくさんのローカル変数を追加してスタックからすべてをコピーし、指定されたインスタンスを複製してすべてを元に戻すことができますが、それは実行時の非効率性であり、私は本当に望んでいません。
どの命令がインスタンス ポインターをスタックに置くかを追跡でき、ターゲット メソッド呼び出しではなくそこにメソッド呼び出しを挿入できれば、うまくいくと思います。しかし、これを行うのに役立つものを見つけることができませんでした。
AspectJ のようなものがこれを可能にしていることは知っていますが、多くのクラスがロードされ、AspectJ が遅すぎるため、これを行う必要があります。
これを可能にするASM上に構築された分析ツールを教えてもらえますか、またはあるメソッド呼び出しを別のメソッド呼び出しの前に挿入するためのより良いアプローチを誰か考えてもらえますか?
java - プリコンパイルされたクラスファイルのインポートの名前を変更する(Java)
どうした? 私はMinecraftサーバー管理者/サーバーホスト/プラグイン開発者ですが、コアゲームの新しいリリースごとに自分の個人用プラグインを更新しなければならないのは絶対に面倒です。いつもそうだったわけではありません。過去にプラグインを壊すことなく、20のバージョンで動作させてきました。毎月1回、40個のプラグインを傍観して更新する必要があることは、ご想像のとおり、これまでこれを行う必要がなかったことを考えると、私の人生で不必要な煩わしさです。
問題の原因は何ですか? 新しいリリースごとに、コンパイルされたjarファイルで異なるインポートを使用する必要があるため、古い(ただしまだ機能している可能性がある)jarファイルを強制的に破棄します。私を信じてください。エラーログを読んで、実際に外に出て新しいアップデートをダウンロードする必要がある時期を知ることができます。今は自分から守る必要はありません。それはただのゲームです、私はそれにあまり乗っていません。
それで私はそれについて何をしたいですか? この目的のために、すべてのプラグインを自動的に更新する簡単なプログラムを作成したいと思います。(プラグインはパッケージ化された.jarファイルの形式で提供されます。)次のことを行う必要があります。
- X_Folder内のすべてのjarファイルのリストを取得します
- jarファイルごとに、すべてのクラスをケースに入れます。
- クラスファイルごとに、Y_STRINGのインスタンスを検索し、それをZ_STRINGに置き換えます。
- すべてがjarファイルに正しく戻されることを確認してください。
- 終わり。
質問? クラスファイル編集メソッドをどのようにコーディングしますか?どうやって始めたらいいのかわからない。
免責事項 私はこれに取り組んでいないように聞こえて申し訳ありません。私は、バイトコード操作の経験がありません。いくつかの例を見てきましたが、インポートの名前変更についてはまだ何も見ていません。うまくいけば、ここの誰かが私を助けることができます。ありがとうございました!
java - ASM バイトコード インスツルメンテーションで機能する引数に互換性がありません
Guava ライブラリを使用した単純なメイン プログラムの実行に問題があります。
ここからコードを使用してメソッドパラメーターを取得するためにクラスをインストルメント化しました: ASM の Java メソッドパラメーター値
問題は、コードが小さなプロジェクト (別名ハノイの塔) で機能する一方で、Guava ではエラーと例外が発生することです。
特に、 Joiner.join メソッドをテストすると、次のエラーが発生します。
-noverify を使用して例を実行すると、例外があります。
メソッドのバイトコードは一貫しています。
エラーがライブラリのバージョンに関連している可能性があることは理解していますが、メインの Java プログラムはインストルメント化されたライブラリに対してコンパイルされ、ライブラリの同じ jar を使用して実行されました。
なぜこれが起こっているのかについてのアイデアはありますか? そして、それはどのように解決できますか?
ありがとう :)
編集
計測前後の withKeyValueSeparator メソッドのバイトコードは次のとおりです。
元のバイトコード:
インストルメント化されたバイトコード:
Joiner クラスの完全なバイトコードは次のとおりです。
オリジナル : http://pastebin.com/VsccVX18
java - オペコードの性質を判断するためのASMバイトコードライブラリのユーティリティメソッド?
ASM には、命令が何らかの種類のストア、ロードなどであるかどうかをオペコードから推測できる utils クラスはありますか?
たとえば、次のコードを検討してください(ASMから)
Utils.isConst(opcode)、Utils.isLoad(opcode)、Utils.isStore(opcode) などのメソッドがあると便利です。
ASM にそのようなものはありますか?