デバッガーを使用せずに、JVM の現在のスコープ内のローカル変数のマップまたはその他のデータ構造を取得する方法はありますか? つまり、現在のスタック フレームのローカルを取得するには?
スタックトレース オブジェクトがあることは知っていますがStackTraceElement
、どの状態にもアクセスする方法がありません。どのメソッドがどこで呼び出されたかを示すだけで、その中に何があったかはわかりません。
デバッガーを支援するために変数名をクラス ファイルに含めることができますがjavac
、既定ではそうしません。-g:vars
オプションが必要です。
存在する場合、プログラムはASMなどのバイトコード エンジニアリング ライブラリを使用して、ローカル変数名とスコープにアクセスできます。
この質問は表現が不十分ですが、重複していると思います。その回答はあなたの問題に関連している可能性があります。名前を気にしない場合は、ローカル変数の型とスコープが常に各メソッドの属性テーブルに含まれていることを付け加えておきます。
これを行う方法はないと思います。コンパイラは常に自由にローカル変数を最適化することができ、そのようなメソッドを提供すると、コンパイラはこのタイプの最適化を利用できなくなります。メソッドをコンパイルするとき、コンパイラは、プログラム内の別の場所で仮説を呼び出したかどうかを判断できないgetLocalVariables()
ため、宣言されたすべてのローカル変数を常にそのようなマップに配置する必要があります。