問題タブ [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バイトコードインストルメンテーション
次のことを高レベルで実行するJVMTIエージェントを作成しました。
onClassLoadHookは、ロードされたクラスのバイトコードを、ASMを使用してクラスをインストルメント化する別のJavaプロセスに送信します
バイトコードを取り戻し、それらをロードします
ロードされたJavaクラスをインストルメント化する別のJavaプロセスでは、次のことを行います。
...。
Java Decompilerを使用して、このインストルメンテーションの後に記述されたクラスを逆コンパイルしようとすると、次の逆コンパイルされた関数が間違っていることがわかります。
私の関数は実際には次のようになっているためです:
私がここで何か間違ったことをしたかどうか誰かに教えてもらえますか?私の唯一の手がかりは、関数に引数としてTHISポインターを渡す代わりに、プリミティブ型を渡すと、すべてがうまくいくということです。私が管理する必要があるこのポインターについて何か特別なことはありますか?バイトコードを比較し、ASMIFIERを使用して、適切なバイトコードを生成するために使用する必要のあるステートメントに関する手がかりを得ました。
java - Javaベリファイアエラーを生成するバイトコードインストルメンテーション
Javaプログラムのバイトコードインストルメンテーションを行うためにASMを使用しています。私がしていることは単純です-メソッドをインストルメント化するとき、命令がPUTFIELDの場合、命令の直前にDUP_X1を実行し、次にPUTFIELDにアクセスして、DUPされたスタックエントリを含む引数を使用して関数呼び出しを挿入します。
コードは、それぞれインストルメンテーションの前と後のようになります。
しかし、インストルメント化されたコードを実行すると、次のようになります。
java.lang.VerifyError:スタック上でオブジェクト/配列を見つけることを期待しています
これについて何か助けがありますか?
java - ASMJavaライブラリを使用した開梱
一部のリフレクションを置き換えるためにASMJavaライブラリを使用しています。このメソッドの本体を生成します:
この生成されたメソッドを使用すると、リフレクションを使用せずに実行時にオブジェクトにフィールドを設定できます。それは素晴らしい働きをします。ただし、プリミティブフィールドでは失敗することがわかりました。これが私のsetメソッドの関連部分です:
このコードは、selectのケースラベルを生成しています。オブジェクトには最適ですが、プリミティブの場合、次のエラーが発生します。
スタック上でフロートを見つけることを期待しています
わかりました、それは理にかなっています、私は自分で開箱をする必要があります。私は以下を実装しました:
トレースして、適切なフィールドの「case Type.FLOAT」に間違いなく入りますが、次のエラーが発生します。
スタック上でオブジェクト/配列を見つけることを期待しています
これは私が立ち往生しているところです。私の人生では、開開が機能しない理由を理解できません。「ALOAD、3」は、setメソッドの3番目のパラメーターをスタックに配置します。これはFloatである必要があります。何か案は?
asm-commonsライブラリには、unboxメソッドを持つGeneratorAdapterクラスがあることがわかりました。ただし、これほど単純なもののために、さらに別のJARを含めたくはありません。GeneratorAdapterソースを調べたところ、非常によく似た処理を行っています。GeneratorAdapterを使用するようにコードを変更して、機能するかどうかを確認しようとしましたが、変換が簡単ではありませんでした。
java - ASM jar - Java プロジェクトがこれに依存しているのはなぜですか?
私は Java プロジェクトを持っており、内部的には に依存していasm jar
ます。奇妙なことに、なぜ私のプロジェクトがこのライブラリに依存しているのかさえわかりません (推移的な依存関係として maven によって持ち込まれる可能性があります)。
asm jar が必要な理由を誰かが教えてくれますか?
前もって感謝します !
編集: asm jarが必要になる可能性のある目的/ユースケースについても言及できますか?
java - Java、ASM org.objectweb.asm.util.CheckClassAdapter により、サポートされていない major.minor バージョン 0.0 が発生する
次の例外が発生しています:
以下のソースコードでバイトコードを計測しようとするとき。(正確には、変更されたバイトコードを実行しようとすると、この例外が発生します)
私はそれが私の InstrumentClassAdapterInstrumenter 実装である可能性があると思ったので、それを省略し、現時点では CheckClassAdapter のみを使用しています。誰が私が間違っているのかを見ることができますか?
乾杯、
java - ASM ビジターを使用してスタックを検査する方法は?
Java バイト コード エンジニアリング ライブラリASMを使用して静的解析を実行しようとしています。フィールドに割り当てられている変数を検査したい状況があります。
私はメソッドMethodVisitor
を実装していvisitFieldInsn()
ます。私は特にputfield
コマンドを探しています。それは問題ありません。問題は、 に遭遇したときにputfield
、フィールドに割り当てられる変数にアクセスできるようにしたいということです。具体的には、変数の型に関する情報にアクセスしたいと考えています。
現時点では、スタックの一番上にあるものを確認するだけで十分ですが、より一般的な方法で検査する方法があれば、さらに優れています。
ASM を使用してスタック上の変数を検査する方法はありますか?
java - 実行時に指定された.classファイルをSystemClassLoaderにロードさせることは可能ですか?
割り当て用の静的分析ツールを作成しています。これは、ASMライブラリを使用してJavaバイトコードを分析します。私たちが使用するASMの部分の1つは、クラスがClassLoaderからロードされることを要求します(または少なくとも要求するように見えます)。
ツールがクラスパスに.classファイルを必要とせずに.classファイルを分析できることを望んでいました。実行時に指定されたディレクトリから.classesをすでにロードし、InputStreamを使用してそれらを読み込みます。ほとんどの場合、これはASMで許容されます。SimpleVerifier
ただし、クラスをロードしようとするクラスなどがあります。
このシナリオでは、を呼び出すとロードされるように、ロードする.classファイルを登録することは可能Class.forName()
ですか?または、これを可能にするためにClassLoaderを拡張する簡単な方法はありますか?
編集:に関する情報URLClassLoader
は役に立ちました。残念ながら、Thread.currentThread().setContextClassLoader()
そのインスタンスを使用することは、このシナリオでは機能しませんでした。私が呼び出しているライブラリコードは、を使用したインスタンスの初期化時に取得するローダーを使用しますgetClass().getClassLoader()
。
URLClassLoaderを設定した時点では、クラスは初期化されていないため、contextClassLoaderはそのクラスをロードしないと思います。
応答を正しく理解しましたか?URLClassLoaderを使用してサードパーティのクラスをロードすることは可能でしょうか?
java - ClassWriter(COMPUTE_MAX + COMPUTE_STACK)が設定されているにもかかわらず、ASM(ObjectWebから)がMaxStackを正しく計算しない
ASMを使用して生成したクラスを読み込もうとすると、予期されるClassVerifyErrorsが発生します。さらに詳しく調べると、jvmが正しく、メソッドが話しているMAX_STACK値が無効であることがわかります。奇妙なことに、スタックと最大ローカルオプションの自動計算を使用しているので、これは問題にはなりません...無効なオプションを使用する方法は非常に単純ですが、結果は不正なバイトコードになります。
目的のメソッドを使用してクラスを作成し、asmで生成されたクラスをjavacが生成するクラスと比較しました。バイトコードの一致は、最大スタックが0であり、javacが値2を設定しているときに間違っています。
最大スタック/ローカルを自分で計算する必要はありません。
java - エラー:java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter。(I)V
私は小さなSpringアプリケーションを開発しています。学生情報の詳細をデータベースに保存する必要があります。SimpleFormControllerを1つ開発しました。NetBeans+Hibernateマッピング+Springを使用しました。プロジェクトをデプロイすると、次のエラーが発生します。
私のspring-config-db-applicationContext.xmlを以下に示します。
次のエラーが発生します。
java - JavaJARのルートパッケージを変更する
私はバイトコードを処理するためにJavaASMライブラリを利用するJavaエージェントを書いています。これは一般的なライブラリであり、コードが実行時に使用しているASMのバージョンを確認したいと思います。
ASMクラスを取得して、すべてのクラスが新しいルートパッケージに再配置されたプライベートコピーに処理するための最も簡単で自動化された方法は何ですか。
具体的には、ASM jarを取得してorg.objectweb.asm.*
、org.myproject.internal.org.objectweb.asm.*
私は主に自動化されたソリューションに興味があることを忘れないでください。ASMのソースを取得し、これを手動またはスクリプトで実行してからjarを再コンパイルできることはわかっていますが、これは多くのオーバーヘッドのように感じます。