7

私の主な質問: 変数名、型、または変数の数さえ知らなくても、リフレクションを使用してクラス フィールドを一般的に出力できることはわかっています。ただし、変数名がわからない場合、現在の関数または現在のスコープ内のすべての変数を一覧表示する方法はありますか?

言い換えると:

int x = 5;
int y = 42;
// some more code
//Now I want to println x and y, but assuming I cannot use "x" or "y".

この質問への回答にも満足しています。すべての変数の名前を保存することが許可されているとしましょう。それは役に立ちますか? 例えば:

Set<String> varNames = new HashSet<String>();
int x = 5;
varNames.add("x");
int y = 42;
varNames.add("y");
// some more code
//Now with varNames, can I output x and y without using "x" or "y"?

なぜ私はこれを尋ねているのですか?ANTLR を使用して XYZ 言語を Java に変換しています。任意の時点でプログラムの状態全体を出力する簡単な方法を提供したいと考えています。

私が満足する3番目の可能な解決策:これがJavaで不可能な場合、呼び出し元の関数にアクセスしてスタックを調べる関数のバイトコードを書く方法はありますか? これで問題も解決します。

驚くべきことは、Java に Pythoneval()や php のget_defined_vars().

それが違いを生む場合、私はJava 6を使用していますが、Java 5、6、または7用のものは何でも良いはずです.

ありがとう!

4

2 に答える 2

4

私が知る限り、あなたはできません。少なくとも、通常の Java コードではそうではありません。バイトコードを実行する前に、ある種のポストプロセッサを介してバイトコードを実行でき、デバッグ シンボルを含めてビルドしていると仮定すると、コードを自動生成してそれを実行できますが、リフレクションを介して現在のスタック フレーム内のローカル変数にアクセスする任意の方法。

于 2012-09-30T06:40:36.547 に答える
1

これをプログラムの通常の実行パスの一部として使用せず、デバッグのみに使用する場合は、Java プラットフォーム デバッガー アーキテクチャ (JPDA)を使用します。基本的に、独自のデバッガーを作成し、ブレークポイントを設定し、JDI APIを使用してプログラムの状態を照会します。ローカル変数はStackFrame#visibleVariables()で一覧表示できます。

上記がオプションではない場合、達成するのは非常に困難です。変数名を取得するには、クラス ファイルを解析し、メソッドのローカル変数テーブル属性を読み取ることができます。ただし、ローカル変数の値を取得する唯一の方法は、aload/iload/etc を使用することです。バイトコード命令。これらは分析するメソッドに存在する必要があるため、この機能を別のヘルパー メソッドに配置することはできません。

于 2012-09-30T11:09:59.613 に答える