問題タブ [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.
classloader - メソッドが true を返すようにバイト コードを変更する
クラスファイルには次のようなメソッドがあります:
この検証メソッド内には多くのコードがありますが、常に true または false を返すようにしたいだけです。これを達成するためにクラスファイルを変更する方法を教えてもらえますか?
bytecode-manipulation - バイト コード インストルメンテーション - ネイティブまたは Java エージェントを実装しますか?
バイト コード インストルメンテーションを使用してプロファイラーを実現したい場合、 JVMTIを使用してネイティブ エージェントを作成する必要がありますか、それともパッケージを使用してJava エージェントを作成する必要がありますか?java.lang.instrument
ASMのようなライブラリを使用したい場合 (本格的なプロファイラーを作成する場合は必須のようです)、Java エージェントを使用する必要があります。ネイティブ エージェントは Java エージェントができることすべてを実行できると思っていたので、これは私を混乱させます。しかし、私には、Java エージェントを作成する方が簡単に思えます。
代替手段はありますか?とにかくJavaエージェントとネイティブエージェントを組み合わせて使用する必要がありますか?
java - バイトコードの実行
次のサンプル コードについて考えてみましょう。
コードを実行すると、try ブロック内で例外が発生したとします。実行フローは catch ブロックに入ります。
ここで、try ブロックのバイトコードを (おそらく ASM を使用して) コピーし、バイトコードにいくつかの変更を適用し (たとえば、stm2 を stm4 に置き換える)、catch ブロック内で新しいバイトコードを実行します。
これは、新しいバイトコードをコンパイルまたはロードせずに、インタープリター言語のように実行するだけで可能ですか?
ありがとうございました!
アップデート
アプリオリに適切なコードを記述できることを知っています。問題は理由ではなく、それを行う方法と可能かどうかです。
新しい try 本体を動的に計算する必要があり、同じオブジェクト内で新しいコードを実行する必要があるとします (ローカル変数とクラス変数のため)。
java - エマはどのように機能しますか?
Emma を使用するには、まず Emma を使用して jar を計測します。その間、em メタデータ ファイルが生成され、インストルメント化された jar に対して JUnit テスト ケースを実行すると、ec ファイルが生成されます。カバレッジ レポートの生成に使用されます。
私の質問は、テスト ケースを実行しているときに em ファイルへのパスを指定していないということです。また、Emma が実行中にポートを使用すると聞いたことがあります。そのポートは何ですか?
java - ASMによるJavaバイトコード操作
ASM 3.3.1 を使用しています。クラスをインターセプトし、そのメソッドの 1 つを変更しようとしています。org.objectweb.asm.util.ASMifierClassVisitor を使用して、新しいメソッドを作成するための ASM コードを取得しています。すべてがうまく機能しますが、if() ステートメントを理解できません。結果の asm コードを if ステートメント (またはループ) で使用しようとすると、実行時に「スタック サイズが大きすぎます」というエラーが発生します。ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES); を使用しています。これが ASMIFY コードです。
if() ステートメントを ASMIFYING しているときにのみエラーが発生する理由がわかりましたか? どんな助けでも大歓迎です。
私がASM化しているコード。(注:私が使用しているのはそれだけなので、メソッドを取り出しました)
元のメソッドには最後の 2 行だけが含まれています
これはよく見えません。私は CheckClassAdapter.verify() メソッドを使用し、いじっているクラスの一部に対してこれを取得しました。
java - ネイティブ Java バイトコード インストルメンテーション
Java でのバイトコード計測には、asm フレームワークと bcel および javaassist ライブラリがあります。
ただし、javaagent が実行されるまでに一部の Java クラス (java.lang.Thread、java.lang.Class など) がすでにロードされているため、ネイティブ コードで計測を行う必要があります。
ネイティブ コードで Java クラスを計測するためのライブラリはありますか?
編集:少し混乱しているようです。
私が望むのは: OnClassLoad イベントフックを使用して、JVMTI API を使用してロード中にクラスのバイトコードを変更するネイティブ Java エージェントを作成することです。
java - ASM ClassWriter コードを生成するツールはありますか?
動的 Java クラスを作成したいのですが、テンプレートを使用してソース コードを生成し、jasper jdt を使用してコンパイルします。しかし今、jdt の依存関係を取り除き、ASM で直接クラス バイトコードを作成したいと考えています。
ソース コードは約 200 行ですが、ASM でバイト コードを生成するのに役立つツールはありますか?
java-bytecode-asm - 動的 Java バイトコード操作フレームワークの比較
動的なバイトコードの生成、操作、およびウィービング用のフレームワークがいくつかあります (BCEL、CGLIB、javassist、ASM、MPS)。それらについて知りたいのですが、それらすべてについてすべての詳細を知る時間はあまりないので、一方と他方の長所と短所を示した比較表のようなものと、その説明を見てみたいと思います。どうして。
ここSOで、似たようなことを尋ねる多くの質問を見つけました.答えは通常、「cglibまたはASMを使用できます」、または「javassistはcglibよりも優れています」、または「BCELは古くて死にかけています」または「ASMはX と Y が得られるので最適です。」これらの回答は役に立ちますが、私が望む範囲で質問に完全に答えるわけではなく、それらをより深く比較し、それぞれの長所と短所を示しています。