問題タブ [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.
java - ソースコード内にバイトコードを挿入できますか?
既にコンパイルされているため、コンパイラがその部分をバイパスするように、クラスのメソッド内にバイトコードを記述できますか? 「asm」を使用してC言語でアセンブリプログラムを書くのに似たもの...
java - バイトコード: LOOKUPSWITCH および TABLESWITCH
現在、BCEL を使用してバイトコードを計測しています。BCEL API では、2 つの命令タイプLOOKUPSWITCH
とTABLESWITCH
( package org.apache.bcel.generic
) が interface を実装していますStackProducer
。これらの 2 つの命令はオペランド スタックをポップ (つまり、それを消費) し、スタック上に何も生成しないことを知っていStackProducer
ますStackConsumer
。これはバグですか?ありがとうございました
(ps: この質問を BCEL メーリング リストに投稿しようとしましたが、回答がありませんでした。ここでもっと幸運が訪れることを願っています)
java - Javaバイトコード操作ライブラリの提案
直感的なAPIを備えた、手入れの行き届いたJavaバイトコード操作ライブラリを探しています。そこにはかなりの数があるようです。どれを試すべきかについて何か提案はありますか?
java - バイトコード操作パターン
バイトコード操作にはどのような正当な用途があり、それらのバイトコード操作ベースのソリューションを実際に実装する方法は?
更新:この質問は、実際には、バイトコード操作の助けを借りてコードを飛ばすために人々が使用するパターンとテクニックに関するものであることをもっと明確にする必要がありました。
すでに言及されているアスペクト指向プログラミングや、その場でのプロキシ オブジェクトの構築、および同様の手法のようなものです。
java - Javaエージェント、JVMTIなどを検出する方法
制御していないマシンで実行している場合、Java環境をどのように保護しますか?誰かがJavaエージェントまたはネイティブJVMTIエージェントを作成し、バイトコードをダンプしたり、クラスを書き直してライセンスやその他のセキュリティチェックをバイパスしたりするのを防ぐにはどうすればよいですか?Javaコードから実行されているエージェントがあるかどうかを検出する方法はありますか?JNIから?JVMTIエージェントから?
java - Java アプリのリンク エラーを静的にチェックする
ライブラリのバージョン 1 に対してコードを記述したシナリオがありますが、代わりにライブラリのバージョン 2 を出荷したいと考えています。コードは出荷されているため、変更できません。v1 には存在し、v2 では削除されたライブラリのクラスまたはメンバーにアクセスしようとするのではないかと心配しています。
コードが新しいバージョンのライブラリにリンクするかどうかを確認するための簡単なチェックを行うツールを作成することは可能であると考えました。コードがリンクされていても、コードがまだ非常に壊れている可能性があることを理解しています。私は反対側からこれについて考えています-コードがリンクしない場合、問題があると確信できます。
私が見る限り、参照、メソッド呼び出し、およびライブラリ クラスへのフィールド アクセスのバイトコード チェックを実行してから、リフレクションを使用してクラス/メンバーが存在するかどうかをチェックする必要があります。
3 つの質問があります。
(1)そのようなツールは既に存在しますか?
(2)私が想像しているよりもずっと複雑で、重要なことを見逃しているような気がしますが、そうですか?
(3)メソッド呼び出し、参照などを見つけることができるようにバイトコードを検査できる便利なライブラリを知っていますか?
ありがとう!
java - 命令を編集するためのJavaクラスファイル/バイトコードエディタはありますか?
Java クラス ファイルを編集するためのユーティリティ (または Eclipse プラグイン) はありますか? Java クラス ファイルのバイトコードを、再コンパイルせずに、完全なビルドパスを持たずに操作したいと考えています。
メソッドの名前変更、命令の追加/削除、定数の変更など。
私が見つけた唯一のユーティリティは次のとおりです。
classeditor です が、機能が非常に限られています (たとえば、名前の変更や命令の操作はできません)。
jbeは変更を保存しません (おそらくクラスの検証が失敗したためです - クラスは完全に実行されますが、変更を行う前に)
(jbe には最初にクラスパスの問題があり、クラスパスを jbe.bat ファイルに追加すると役立ちました)
java - クラスファイルのバイトコードを表示することはできますか?
Java ソース コードはバイトコードにコンパイルされ、実際にはクラス ファイルにあります。コンパイルされたクラスのバイトコードを表示することはできますか?
可能でしたら編集可能でしょうか?
そのためのEclipseプラグインはありますか?
eclipse-plugin - ビルド時に Eclipse インストルメント クラスを作成するにはどうすればよいですか?
場合によっては、カスタムのバイトコード変換を実行する必要があります。私は主にasmとjavaassitを使用しています。
通常、Eclipse 内では、-javaagent jvm パラメーターを使用してコードを実行します。Eclipse の外では、maven、ant、またはコマンド プロンプトを使用して、アプリケーション コードを実行する前にウィーバーを呼び出します。
しかし、要点は、ビルド時にEclipse内でインストルメンテーションを実行したいということです。
- それを行う最良の方法は何ですか?
- APIを実装することで接続できるプラグインは既に作成されていますか?
- これを eclipse monkey でスクリプト化してもいいですか?
- Ant ビルダーを使用してウィーバーを呼び出すことはできますか?
- AspectJ プラグイン (巨大なはずです) を見て、独自のプラグインを作成する方法を考えてみるべきですか?
- インスピレーションを得るために他のプラグインを見る必要がありますか?
ありがとう。
java - ObjectWeb ASM を使用して、バイトコード操作 PUTFIELD が「この」オブジェクトに属するフィールドを再割り当てしていることを確認する方法は?
ASMバイトコード操作フレームワークを使用して、Java コードの静的分析を実行しています。オブジェクトのフィールドが再割り当てされたとき、つまりこの種のコードが発生したときを検出したいと考えています。
次のコードを ( を実装するクラスでClassVisitor
) 使用すると、上記の状況を検出できます。
ただし、このコードは、フィールドを所有するオブジェクトに関係なく呼び出されます。オブジェクトに対してPUTFIELD 操作が実行される、より具体的なケースを見つけたいと思いthis
ます。たとえば、最初のコード スニペットと次のようなコードを区別したいと考えています。
上記の場合、PUTFIELD 操作は引き続き実行されますが、ここでnewObject
はオブジェクトではなくローカル変数 ( ) に対して実行されthis
ます。これは、割り当て時のスタックの状態によって異なりますが、バイトコードがまったく異なるいくつかの異なるシナリオに遭遇したため、この複雑さを処理する方法を探しています。
this
PUTFIELD がオブジェクトに属するフィールドを再割り当てしていることを確認するにはどうすればよいですか?
編集
既存のバイトコードを計測するのではなく、分析のみを実行するために ASM を使用しています。可能であれば、バイトコードを変更せずにこれを発見する方法を見つけたいと思います。