問題タブ [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 - クラスファイルを書き換えてフィールドなどの型を変更するための推奨バイトコード操作ライブラリは?
フィールドのタイプを別のタイプに置き換えながら、既存のクラス ファイルからクラス ファイルを生成する方法を探しています。
この例のスニペットを考えてみてくださいint bar
。
で long bar
、次のように:
cglib、javassit、ASM などの複数のバイトコード操作ライブラリを調べましたが、それらはすべて、メンバーの追加または 1 つのメソッド本体と既存の別のメソッド本体の置き換えに重点を置いているようです。
次のようなものを提供するライブラリはありますか...
...ばかげた方法で?または、メタデータを修正し、メソッド本体のさまざまなバイトコード命令iload
をlload
手動で置き換えるなど、すべての醜いものを実装する必要がありますか?
java-bytecode-asm - ASM バイトコード操作を使用してメソッド内のコンストラクター呼び出しを静的呼び出しにラップする
私のクエリは、ASM を使用したバイトコード操作に関連しています。
次のような方法があります -
上記のメソッドでは、SampleClass2() コンストラクターを、ロジックを実行した後に同じ SampleClass2 オブジェクトを返す 1 つの静的メソッド呼び出しに変更したいと考えています。その後、私のメソッドは次のようになります。
ASM バイトコード操作を使用してこれを達成する方法を教えてください。同じように既存のバイトコードスタックを変更する必要がありますか?DUP
java-bytecode-asm - HttpURLConnectionを使用したASMバイトコード
ASM ByteCodeライブラリを使用して、HttpUrlConnection icが作成されたときにリクエストヘッダー(UUID)を追加します。以下は私のコードです-出力も取得しています===>これはHttp CONNECTメソッドです!。しかし、ヘッダーを追加する方法がわかりませんか?
java - アノテーションベースのJMX
SpringのようなアノテーションベースのJMX機能をどのように実装しますか。クラスがマークされ@ManagedResource
たクラスのメソッドによってマークされている場合、 @ManagedOperation
JMXを介して自動的に公開されます。
MBean表記でインターフェースを作成することは避けたいと思います。PlaywithGuiceフレームワークを使用しています。素朴なアプローチが最初に思い浮かびます:
- Guiceが管理するすべてのクラスを反復処理します
- クラスがアノテーションでマークされている場合は、MBeanアノテーションに適合する新しいインターフェースを作成します。クラスを修正します。修正されたクラスは、新しく作成されたインターフェイスを実装する必要があります。
- クラスのインスタンスをMBeanサーバーに登録します。
2番目のステップは、ASMなどのバイトコード操作ツールを使用して実行されます。ASMでそれを行うことは可能ですか?そのような機能をどのように実装しますか?
annotations - バイトコード インジェクションはどこで発生しますか?
動機
私はSomeObject.java
ファイルを持っています:
コンパイルすると、バイトコードを含むSomeObject.class
ファイルが作成されます。
JVM で SomeObject を使用すると、現在のクラスローダーによってロードされ、すべて正常に動作します。
ここで、動的コード生成が必要だと仮定しましょう。カスタム注釈を書くことができます
クラス宣言に修飾子として追加します。
ランタイム用に保持することもできます@Retention(RetentionPolicy.RUNTIME)
:
質問
バイトコード インジェクションに使用される注釈はどこにありますか? 次の図のように、適切な実行時保持アノテーションを使用してクラスをロードするときに、クラスローダーはバイトコードを挿入しますか?
python - Python の実行前にデフォルトの type() メタクラスをオーバーライドする
ここにドラゴンがいます。あなたは警告されました。
より良いテスト スイートを作成するのに役立つ新しいライブラリを作成することを考えています。これを行うための機能の 1 つは、テスト ランナーではなく、テスト対象のシステムで使用されているすべてのオブジェクトにテスト ダブル (モック オブジェクト、スタブ、フェイク、またはダミー)
があることを検証する機能です。)。テスターがライブ オブジェクトを必要とするため、テストの分離を減らす場合は、そのように明示的に指定する必要があります。
type()
これを行う唯一の方法は、デフォルトのメタクラスである組み込み関数をオーバーライドすることです。
新しいデフォルト メタクラスは、test double レジストリ ディクショナリをチェックして、test double に置き換えられているかどうか、またはライブ オブジェクトが指定されているかどうかを確認します。
もちろん、これは Python 自体では不可能です。
テスト スイート (およびおそらく Python) が実行される前に、Python のメタクラス ルックアップに介入する方法はありますか?
たぶんバイトコード操作を使用していますか?しかし、どのように正確に?
java - Java "implibs" 別名 jar には実際のコードがなく、空のボディを持つメソッド定義のみが含まれていますか?
Windows には「インポート ライブラリ」別名「implibs」の概念があります。コードを動的ライブラリにリンクする場合は、.dll 自体に対してリンクするのではなく、.dll を呼び出すサンクを含む特別な静的ライブラリに対してリンクします。 . まあ、それは間違いなく Windows の特異性ですが、場合によっては、その考えはそれほど悪くありません。
たとえば、それぞれ平均 2MB の 100 個の動的ライブラリと、このシステムの 10 個のバージョンで構成される複雑なシステムがあるとします。したがって、すべてのバージョンでこのようなシステムを完全にサポートするために出荷する SDK は、リンクするライブラリだけで 2GB になります。シンボルと小さなサンクのみを含む Implib を使用すると、はるかに少なくなります。
implibs の概念は、通常の Unixish 共有ライブラリに非常に簡単に適用できます。シンボルをダンプし、それらから C で単純なサンクを作成し、コンパイルして、ほら、オリジナルの代わりにそのライブラリにリンクできます。
ここで、同じ考えを Java に拡張したいと思います。したがって、理想的には、jar を取り、その中のバイトコード クラスを書き直してメソッドの本体を削除し、空の (可能な限り) 本体を持つメソッド定義のみを残すツールを探しています。そのようなツールが存在しない場合は、そのようなツールを簡単に作成できる Java バイトコード変換フレームワークへのポインタを探しています。それができない場合は、少なくとも jar からすべてのメソッド シグネチャをダンプできるツールを探して、ネイティブ共有ライブラリの場合と同様のアプローチに従います (当然、空の Java を追加することはできなかったので、より複雑になります)。代わりに、有効な型の値を返す必要があります)。
java - ASM 4 (Java ライブラリ) チュートリアル?
私は最近、実行時にバイトコードを変更するための Java ライブラリ 'ASM' を使用していますが、ASM 4 に関するチュートリアルを 1 つも見つけることができませんでした。 ASM 4 は、存在さえしなかった ASM クラスを参照していました。
メソッドへのコードの挿入など、基本的なものから中間的なものまでをカバーするライブラリのチュートリアルを誰かが知っているかどうか疑問に思っています。
java - 外部 jar ファイル内のアンロードされたクラスからのバイトコードの読み取り
私のJavaアプリケーションでは、実際にはロードされていないクラスファイルからバイトコードの内容を読みたいと思っています.jarファイルもロードされていません。のように、理想的には、任意の jarfile を取り、その中のすべてのクラスを見つけることができる必要があります。したがって、次の状況を取ります。
私のアプリケーション (ライブラリのようなもの) は、任意のパスで特定の jar を「チェック」するように求められ、ライブラリを使用して類似点 (定数プールの類似点など) を見つけるためにアプリケーションによって提供されるさまざまなパターンが提供されます。したがって、私のライブラリは、クラス ファイル内のすべての jar を通過する必要があります。明らかに、ハードコーディングするか、ファイルからロードすることもできますが、jar 内のすべてのファイルのバイトコードを調べてそれらを一致させることができるようにしたいのです。