0

私はこれをしたい:

私のコードでは、変数 X = 1 です。コードをコンパイルして実行します。プログラムはユーザーに X を設定するように要求し、X はユーザー入力から 2 に設定されます。次にコードをコンパイルして実行するときは、プロンプトの前に X を 2 にします。

ファイルまたはデータベースを使用して読み取り/書き込みを行うこともできますが、問題は、ユーザー入力から新しいフィールドまたはクラスを作成できるように、フィールドの変更を超えて上記の例を最終的に拡張したいことです。ASM 統合とその使用方法を理解するのに苦労していますが、私は Java (Eclipse を使用) に最も精通しているため、Java について質問します。誰かが私のような簡単な例を持っている場合^^またはガイダンスを提供できる場合は、それをいただければ幸いです。単純なフィールド変更を行うには、ASM を使用して実行中のクラス ファイルを追加できますか?それとも、新しいクラス ファイルを (更新されたフィールドで) 作成し、元のファイルを削除する必要がありますか?

4

1 に答える 1

1

ガイダンス: バイトコード エンジニアリング ライブラリ (BCEL) など、Java バイトコードの操作を容易にするように設計されたライブラリを使用します。そのライブラリのドキュメントとサンプル プログラムを読んで、提供されるツールとその使用方法を理解してください。

注: クラスローダおよび実行環境にすでにロードされているコードを変更することはできません。Java はそれを許可しません。あなたができることは、クラスの新しいコードを生成し、このクラスでは以前にロードされたコードではなく新しいコードを使用する必要があることを理解するクラスローダーをセットアップし、その特別なクラスローダーからこのクラスの新しいインスタンスを要求し、動作することです。その後、そのインスタンスで。以前のインスタンスへの参照は、依然として古いコードを実行していることに注意してください。

これをさらに詳しく説明することは、StackOverflow の投稿の妥当な範囲を超えていると思います。繰り返しになりますが、バイトコード操作ツールのドキュメントを参照し、その例を調べてください。何かに行き詰まった場合は、具体的な質問をして私たちに戻ってきてください。

これが簡単だとは思わないでください。また、非常に特殊な例外を除いて、実用的であるとは期待しないでください。その場で新しいコードを生成することは、合理的な考えである場合もありますが、自己変更コードは常に悪い考えです。

幸運を。

于 2014-03-07T22:16:09.747 に答える