問題タブ [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 投票する
2 に答える
1895 参照

java - インターフェイスで ASM メソッド ビジターを使用できますか?

指定されたインターフェイスのメソッドを呼び出すクラスを一覧表示するツールを作成する必要があります。これは、多くのモジュールで構成される大規模な Java アプリケーションのビルド プロセスの一部として使用されます。目標は、特定の Java モジュール間の依存関係を自動的に文書化することです。

依存関係を分析するためのツールをいくつか見つけましたが、それらはメソッド レベルでは機能せず、パッケージまたは jar に対してのみ機能します。最後に、 ASMを見つけました。これは、必要なことをしているようです。

次のコードは、特定のディレクトリ内のすべてのクラス ファイルのメソッドの依存関係を出力します。




問題:

コードは通常のクラスでのみ機能します。クラス ファイルにインターフェイスが含まれている場合、 visitMethod が呼び出されますが、visitMethodInsnは呼び出されませ。インターフェイス メソッドの呼び出し元に関する情報は得られません。

何か案は?

0 投票する
5 に答える
7027 参照

java - ASM または Javassist を使用したフィールドの get および set パフォーマンスの改善

開発中のオープンソース プロジェクトへの反映を避けたい。ここでは、次のようなクラスがあります。

注釈をスキャンして@Property、PurchaseOrder から反射的に設定および取得できるものを判断します。とをすべて使用するそのようなクラスが多数ありjava.lang.reflect.Field.get()ますjava.lang.reflect.Field.set()

理想的には、プロパティごとに次のような呼び出し元を生成したいと思います。

PurchaseOrderクラスをスキャンすると、そのような静的内部クラスを作成できます。

これらを使用すると、反射のコストを完全に回避できます。ネイティブ パフォーマンスでインスタンスを設定および取得できるようになりました。誰かが私にこれを行う方法を教えてもらえますか。コード例は素晴らしいでしょう。良い例をネットで検索しましたが、このようなものは見つかりません。ASM と Javasist の例もかなり貧弱です。

ここで重要なのは、渡すことができるインターフェイスがあることです。したがって、Java リフレクションをデフォルトとして使用するもの、ASM を使用するもの、Javassist を使用するものなど、さまざまな実装を使用できますか?

どんな助けでも大歓迎です。

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

java - Asmバイトコードジェネレーター(ClassWriter)を使用したジェネリック型のメソッドの生成

Asmを使用すると、単純なゲッターとセッターを簡単に定義できます(幸い、FAQでも説明されています)。しかし、言及されておらず、ドキュメントを見つけることができなかった1つのことは、ジェネリック型情報を使用してこれらを実装する方法です。

私は実際にジェネリック型情報自体を非常に簡単に判別できます(コードは既存のフィールドやメソッドを取り、完全なジェネリック型の処理と解決が存在するため)。ジェネリック型が含まれている型のジェネリックバージョンを生成する必要があります。

これが署名AsmClassWriter/ MethodVisitor呼び出しの変更と同じくらい簡単であることを願っていますが、ドキュメントの一部のコメントは、それほど簡単ではない可能性があることを示しています(ジェネリック情報は通常の情報とは少し異なる場所に格納されるため)。

編集:エントリポイントは「ClassWriter.visitField / Method(....、文字列署名)」のように見えます-通常の非ジェネリッククラス情報を含む「説明」ですが、「署名」(JLS)という用語は具体的にはジェネリックスへ-タイプ情報を含みます。

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

java - ObjectWeb ASM を使用して、バイトコード操作 PUTFIELD が「この」オブジェクトに属するフィールドを再割り当てしていることを確認する方法は?

ASMバイトコード操作フレームワークを使用して、Java コードの静的分析を実行しています。オブジェクトのフィールドが再割り当てされたとき、つまりこの種のコードが発生したときを検出したいと考えています。

次のコードを ( を実装するクラスでClassVisitor) 使用すると、上記の状況を検出できます。

ただし、このコードは、フィールドを所有するオブジェクトに関係なく呼び出されます。オブジェクトに対してPUTFIELD 操作が実行される、より具体的なケースを見つけたいと思いthisます。たとえば、最初のコード スニペットと次のようなコードを区別したいと考えています。

上記の場合、PUTFIELD 操作は引き続き実行されますが、ここでnewObjectはオブジェクトではなくローカル変数 ( ) に対して実行されthisます。これは、割り当て時のスタックの状態によって異なりますが、バイトコードがまったく異なるいくつかの異なるシナリオに遭遇したため、この複雑さを処理する方法を探しています。

thisPUTFIELD がオブジェクトに属するフィールドを再割り当てしていることを確認するにはどうすればよいですか?


編集

既存のバイトコードを計測するのではなく、分析のみを実行するために ASM を使用しています。可能であれば、バイトコードを変更せずにこれを発見する方法を見つけたいと思います。

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

java - ASMJavaバイトコードを介して外部クラスのプライベートフィールドにアクセスするときにjava.lang.IllegalAccessErrorを取得します

リフレクションでは、プライベートフィールドはgetDeclaredField()およびsetAccessible(true)を介してアクセスできます。Objectweb ASMバイトコードAPIを介して外部クラスのプライベートフィールドにアクセスするにはどうすればよいですか?のようなものからプライベートフィールドを取得するように設定しました

バイトコードを実行してプライベートフィールドを取得すると、常にエラー「java.lang.IllegalAccessError」が発生しました。

どんな手掛かり?バンドルに感謝します、

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

java - 計装

私はASM(バイトコード操作キット)を初めて使用し、Javaバイトコードの計測に使用しています。クラスのメソッドにアクセスし、ASMを使用してそれらのアクセス修飾子を変更したいと思います。誰かがこれを達成する方法について考えを持っていますか?私はvisitMethodを呼び出すことが役立つことを知っていますが、それを正確に行う方法がわかりません。これに関する情報は役に立ちます。ありがとうございました。

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

java - ASMifierClassVisitor の使用中にエラーが発生しました

ASMifierClassVisitor ツールを使用してクラス作成の asm コードを取得したかったのですが、使用するとエラーが発生します

コードを使用しました

ここで何が問題なのですか?

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

java - Java: 同じ JVM 内から実行時にクラスのバイトコードを取得する

関連: 実行時にクラスのバイトコードを取得する方法はありますか?

Clojure に耐久性を追加していて、ようやく関数を追加する準備が整いました。Clojure では、関数は (とりわけ) 呼び出しメソッドを持つクラスにバイト コンパイルされます。このように、関数はファースト クラスです。これらを永続的にするには、これらのクラスをシリアライズおよびデシリアライズする必要があります。.class ファイルにアクセスせずにクラスのバイトコードを取得するにはどうすればよいですか?

間違っている場合は訂正してください。ただし、エージェントを使用するには、最初の VM に接続するエージェントで別の VM を生成する必要があります。同じ VM から実行する必要があります。

Serializable を使用して Class オブジェクトを設定および取得するだけでは十分ではありません。デシリアライズ時にクラスをロードする必要があり、後続の VM インスタンスでクラス名の競合が発生する可能性があります。逆シリアル化/クラスの読み込み時にクラスの名前を一意に変更するには、バイトコードを変更する必要があります。

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

java - asm の静的初期化子

asm を使用してクラスに追加した静的フィールドを初期化したい。静的初期化子にアクセスできれば、初期化できます。

静的フィールドを初期化するにはどうすればよいですか?

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

java - フィールドの値の設定をインターセプトするためのバイトコード操作

ASMまたはのようなライブラリを使用して、cglibバイトコード命令をクラスに追加して、クラス フィールドの値が設定されるたびにコードを実行する方法はありますか?

たとえば、次のクラスがあるとします。

コードのセクションに次の行が含まれているとします。

person.name = "Joe";

dirtyフラグが に設定されるように、この命令をインターセプトする必要がありtrueます。クラスメソッドはバイトコード操作によって変更できるため、セッターメソッドでこれが可能であることはわかっていますが、フィールドperson.setName (“Joe”)に対しても同じことをしたいと考えています。

これは可能です

編集

クラスにアクセスするコード セクションの変更を避けたいので、傍受コードをクラスの一部として保持する方法を探していPersonます。Python クラスのプロパティに似た、フィールド アクセス用の疑似メソッドはありますか?