問題タブ [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で同じ「ジェネレータ」を使用してJavaバイトコードとソースコードの両方を生成できますか?
私のグーグルfooは私を失敗させています。アノテーションに基づいてコード生成を行うことができるフレームワークがあり、開発者が事前にコンパイルし、生成されるものを確認し、場合によってはコードを変更できるように、ビルド時のソースコード生成の両方をサポートしたい場合、しかし、プラグインベースのアプリなど、より動的なアプリのランタイムバイトコード生成も提供します。両方のタスクにASMを使用できますか、それとも2つの異なるライブラリを使用してこれを2回プログラムする必要がありますか?可能であれば、例へのリンクを歓迎します。
java - メソッドが permgen メモリに寄与しているかどうかを確認します
permgen メモリ リーク バグと戦っています。実行中のシステムをチェックする能力が非常に限られているため、ソース コードをさまようことを余儀なくされています。検索範囲を縮小するために、(おそらく) permgen 領域からメモリを消費するメソッドのみを見つけたいと考えています。
たとえば、確実に呼び出されるルート メソッド セットがあります。そのセットから、おそらく permgen 領域からメモリを消費するメソッドへのパスを見つける必要があります (つまり、String.intern() が呼び出されるなど)。現在、私は 2 つの問題に直面しています: メソッドが permgen スペースを消費しているかどうかを判断する方法と、2 つ目 - バイトコードをたどって実行パスをたどるにはどうすればよいですか?
事前に感謝します。どんな情報でも大歓迎です!
java - JVMに挿入する前にJavaバイトコードを検証する方法は?
「オンザフライ」で生成されたバイトコードを検証しようとしています。
私はすでにいくつかの試みをしました。1つの試みはEclipseコンパイラを使用して実行時にクラスをコンパイルすることであり、もう1つはここで説明するようにメモリからコンパイルすることでした。
最初の結果は問題ないように見えましたが、JAVA 6のガイドラインとセキュリティ測定、および通常のOOPモデルに従って、検証プロセスが本当に有効かどうかはまだ100%わかりません。
バイトコードを検証するためのより良い方法はありますか?
java - javassistを使用してjava演算子をバイトコードのメソッドに置き換えます
私の目標
実行時に比較が行われるタイミング(または、*、-、/、>、<、..などの他の操作)を検出できるようにするため。
これは、Javassistまたはow2ASMを使用してクラスのバイトコードを編集するために実現する必要があります
達成しなければならないこと
このコード
になる必要があります
greatThanは、「>」とまったく同じ結果を返しますが、比較の量を節約するためにも使用されます。その後、比較が行われるたびに外部クラスに通知されます。
追記
それは、手術があるところならどこでも行われなければなりません。したがって、ifステートメントだけではありません。
これの意味は
またになる必要があります
Javassistまたは他のライブラリでこれを実現する方法について何か提案はありますか。
IFLT、IFGTなどのオペコードと関係があると思います
java - インストルメンテーションを使用して Java クラスにコードを追加する: ASM または BCEL?
「登録された」イベント ハンドラ クラスのリスナー メソッドを呼び出してイベントをディスパッチするイベント ディスパッチャ クラスを持つゲーム エンジン/ライブラリを作成しています。適切なディスパッチャー メソッドを呼び出すことで、イベント ハンドラー/リスナーをイベント ディスパッチャーに登録できます。
これは明らかに、すべてのイベント ハンドラーを登録するためのボイラープレート コードにつながります (また、私のエンジンの他の側面にも同様のボイラープレート コードがあります)。そのため、コーディング中にイベント ディスパッチャに明示的に登録する必要はありません。プログラムの実行時に、ディスパッチャの register メソッドの呼び出しが自動的に追加されます。
インストルメンテーションを使用するには、何らかのバイトコード修飾子 API を使用する必要があることを理解しています。ASM と BCEL の 2 つを知っています。どちらを使用する必要がありますか? 明らかに、これは私が行おうとしているやや単純なタスクであるため、学習しやすく、より適切に文書化されたタスクが必要です。
編集:これは具体的な例です。
元のイベント ハンドラ クラス:
変換後:
java - ASM COMPUTE_MAXS が基本的なテスト ケースで機能しない?
記事の一番下にテストケースがあります。次のエラーが発生します。しかし、私は設定new ClassWriter(ClassWriter.COMPUTE_MAXS)
したので、自動的に最大スタックを計算して適切に設定するべきではありませんか?
テストケース:
java - 具体的なクラス タイプを見つけるための ASM 変換
パッケージ内のクラスから他のクラスへのメソッド呼び出しを追跡するプロジェクトに取り組んでいます。具体的な型を識別できることが重要であり、トレースのオーバーヘッドを最小限に抑えたいと考えています。プローブがトリガーされるタイミングに制限はありません。メソッドが呼び出される前でも後でもかまいません。
現在 ASM が使用されていますが、必須ではありません。システムは動的アタッチメントを可能にするために AspectJ から移行しているので、それはありません。
以下、現状です。「トレーサー」列挙型/シングルトンは、probe(int) を受け取り、呼び出しを処理します。具象型から参照型への呼び出しを見つけるだけで十分です。
さらに先に進むための私の考えは、呼び出されたクラスへの参照を何らかの方法で取得し、 getClass() を呼び出して具象型を取得することです。スタックが INVOKEINTERFACE のオブジェクト ref を一番上に含んでいる場合、これは些細なことですが、呼び出されたメソッドへのパラメーターはその上に配置されます。
パラメーターの数がわかっている場合、オブジェクト参照のスタック位置を計算することは問題になりませんが、Java はスタック内の下位から参照を複製する方法を提供しません。
何かアドバイス?
乾杯。
java - JVM アセンブリ コードをバイトコードにコンパイルするにはどうすればよいですか?
実行javap -c ASM.class > ASM.java
してアセンブリ コードを取得した場合、これを再コンパイルして JVM バイトコードに戻すにはどうすればよいでしょうか。
java - バイトコード インジェクションが役立つ可能性があるのはどこですか?
今年はソフトウェア工学の修士論文を書きます。Java でのバイトコード インジェクション / 操作に興味があります。Java EE 開発者に役立つアプリケーションを書きたいと思います。残念ながら、バイトコード変換が使用できる実際の使用例は見つかりません。フォールト インジェクターまたはミューテーション テスト フレームワークを作成することを検討しました。悲しいことに、そのようなプロジェクトはすでに存在しており、論文の要件に合わない可能性があります (プロジェクトは革新的でなければなりません)。他にアイデアはありますか?