問題タブ [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.
java - クラスまたはパッケージの使用状況をチェックするASM
ASMを使用して、jar内のコンパイル済みコードが、クラス内の特定のメソッドをチェックするのではなく、特定のパッケージまたはクラスを使用しているかどうかを確認するにはどうすればよいですか?
java - Java ASM を使用して追加されたメソッドの呼び出し中に ClassFormatError エラーが発生する
Java ASM を使用して、コンパイル済みクラスにメソッドを追加しています。実行時に
、新しく追加されたメソッドが呼び出されると、エラーが発生します。
以下は、私が追加することを期待している方法です
以下は、このための asm コードです。
ここで私が間違っていることを特定するのを手伝ってくれる人がいます。よろしくお願いいたします。
java - ASM ClassWriter コードを生成するツールはありますか?
動的 Java クラスを作成したいのですが、テンプレートを使用してソース コードを生成し、jasper jdt を使用してコンパイルします。しかし今、jdt の依存関係を取り除き、ASM で直接クラス バイトコードを作成したいと考えています。
ソース コードは約 200 行ですが、ASM でバイト コードを生成するのに役立つツールはありますか?
java - ASM を使用して「暗黙の」変数のジェネリック シグネチャを見つける
ASM 4.0 を使用して依存関係検索ツールを作成していますが、解決できないまれなケースが見つかりました。私が抱えている問題は、以下のコードで MyClass の使用法を特定することに関係しています。
ArrayList の使用は MethodVisitor.visitTypeInst() を使用して識別できますが、ジェネリック型パラメーターでの使用を識別するためにそのスコープで使用できるシグネチャ メソッドはありません。ローカル変数が作成されないため、 MethodVisitor.visitLocalVariable() も解決策ではありません。ローカル変数が明示的に宣言されている場合:
MethodVistor.visitLocalVariable() は、署名パラメーターを介してジェネリック型情報へのアクセスを提供するため、正常に機能します。ジェネリック型パラメーターにアクセスする方法が見つからないのは、ローカル var が宣言されていない暗黙の場合のみです。
このコードの一般的な情報を使用してクラス属性にアクセスする方法があると想定していますが、これを行う方法がわかりません。
助けてくれてありがとう!!
java-bytecode-asm - 動的 Java バイトコード操作フレームワークの比較
動的なバイトコードの生成、操作、およびウィービング用のフレームワークがいくつかあります (BCEL、CGLIB、javassist、ASM、MPS)。それらについて知りたいのですが、それらすべてについてすべての詳細を知る時間はあまりないので、一方と他方の長所と短所を示した比較表のようなものと、その説明を見てみたいと思います。どうして。
ここSOで、似たようなことを尋ねる多くの質問を見つけました.答えは通常、「cglibまたはASMを使用できます」、または「javassistはcglibよりも優れています」、または「BCELは古くて死にかけています」または「ASMはX と Y が得られるので最適です。」これらの回答は役に立ちますが、私が望む範囲で質問に完全に答えるわけではなく、それらをより深く比較し、それぞれの長所と短所を示しています。
compiler-construction - Java to Java Bytecode Compiler: Java クラス ライブラリ情報を取得するにはどうすればよいですか?
私はJasminコードにコンパイルし、それをアセンブルして、Java から Java バイトコードへのコンパイラを作成しています。ソースコードファイルがJavaライブラリクラスを参照して使用できるようにすることを意図して作成しています(文字列、印刷などにはほとんど必要です)。私の問題は、これをどのように行うかです。
ここまでは、Java インストール フォルダー内のテキスト ファイルに保持されているすべてのライブラリ クラスのリストへの参照を使用してきました (パッケージと名前がリストされているだけです)。パーサー/タイプ チェッカーのコーディングに使用しましたが、ライブラリ クラスが使用されたときにタイプ チェッカーがタイプ チェックを実行できなかったため、これは理想的とは言えませんでした。
ライブラリ クラスのメソッドを呼び出したい場合は、完全なメソッド シグネチャ (私がアクセスできないもの) を指定する必要があるため、コード生成に取り組んでいるので、これは本当に問題です。
どのように進歩するかについて人々のアドバイスが何であるかをさまよっていました。1 つの方法は、すべてのクラスを調べて、すべてのパラメーターと戻り値の型のデータベース/リストを作成することです。これは明らかに非常に時間がかかり、おそらくあまりにも非現実的です。他のよりエレガントなアプローチが可能ですか?
ありがとう、ウィル
PS私はこれをコーディングするためにPythonを使用しています。ソリューションで Java コードを使用する必要がある場合は、それをサブプロセスとして実行できると思います。
java - Java バイトコード:onmethodExit での 2 つの for ループ
私はテスト方法を持っています:
そのため、メソッドに2つのforループコードを挿入したいのですが、新しいリストの前後に、同じasmコードがあります:
新しいクラス ファイルの最初の for ループは正しいですが、2 番目の for ループは正しくなく、リターンが失われます。コードは同じです。
どこに問題がありますか、どうもありがとう
java - 最良の選択?コンパイル前にバイトコード (asm) を編集するか、Java ファイルを編集します。
ゴール
- 変数と変数のコピーがどこで比較されているかを検出する
- 操作が発生した行の近くにコードを挿入する
- コードの目的: クラスが実行されるたびにカウンターを増加させる
汎用: 特定のパラメーターを使用した実行後に行われた比較とコピーの数をカウントします
2つのオプション
注:私は常に最初に.javaファイルを持っています
1) Java ファイルの編集
正規表現との比較を見つけ、行の近くにコードの断片を挿入してから、クラスをコンパイルします (私のアプリケーションは JavaCompiler を使用します)
2) ASM バイトコード エンジニアリングを使用する
また、追跡したいイベントの場所を検出し、バイトコードにピースを挿入してから、(すでにコンパイルされているが変更された)クラスを使用します
私の質問
最善/最もクリーンな方法は何ですか? これを行うより良い方法はありますか?
java - asmコード内からInstrumentation.retransformClasses()を正しく使用するにはどうすればよいですか?
私はasmライブラリを使用して、Javaバイトコードの変更を実行しています。具体的には、クラスを変更して、新しいインターフェイスと関連するメソッドを実装しています。私の現在のアプローチは、javaagentを介してコアasmAPIを使用しています。.classファイルを静的に変更するのではなく、この動的なアプローチを維持したいと思います。
より高いレベルでは、私の問題は、Bから拡張するクラスAを変更することを選択した場合、Bも変更する必要があることです(クラスがJVMにロードされる方法を理解していると、クラスBは常にクラスAの前にトランスフォーマーに渡されます(間違っている場合は修正してください)。その仮定を前提として、Bに戻って再トランスフォームする必要があると考えています。私のアプローチは次のコードに含まれています。
(コンストラクターで渡されるinst
ハンドルです)Instrumentation
私が苦労しているのは、コメントでマークされているブロック**2**
です。AがBを拡張し、Aの変換に「興味がある」ともう一度言いましょう。私が期待しているのは、スーパークラス(B)の名前が印刷されていること**1**
です(ただし、私は考えていないため、変換されません)最初のパスで興味深いです)そして、**2**
AのスーパークラスがBであることがわかったら、Bを再変換しようとする必要があります。この時点で、このメソッドが(を介してinst.retransformClasses()
)再度呼び出されることを期待しています。 Bがで印刷されるのを参照してください**1**
。しかし、私はしません。(printステートメントを追加し、retransform呼び出しに到達していることを確認しました。これも確認しInstrumentation.isRetransformClassesSupported()
、Instrumentation.isModifiableClass(c)
両方ともtrueを返します)。
エージェントを正しく設定したと思います。マニフェストでCan-Retransform-ClassesとCan-Redefine-Classesの両方をtrueに設定します。また、エージェントのpremain
メソッドでインストルメンテーションにトランスフォーマーを追加すると、次のようになります。
私がここで間違っていることについての洞察はありますか?ありがとう。
java - ASMを使用したフィールド変異の検出
クラスのメソッドの1つがASMを使用して特定のインスタンスフィールドを変更するかどうかを検出したいと思います。例えば:
質問:インスタンスフィールドは、クラスBoxのメソッドの1つによって変更されていますか?この場合、はい。
ASMツリーライブラリのMethodNodeクラスを使用すると、次のようなメソッドのオペコードを取得できます。
この配列には、putfieldのオペコード181が含まれていますが、割り当てられているのはフィールドBox.oであることをどのように確認できますか?
ところで:配列に-1の値が含まれているのはなぜですか?
Tnx