(編集:以前の2つの回答が削除されました。1つは編集前の質問に回答するためのもので、もう1つは完全に間違っていないとしても、少なくともそれに近いもののためです。)
(javac -g
)のデバッグ情報を使用してコンパイルする場合、ローカル変数の名前は.classファイルに保持されます。たとえば、次の単純なクラスを見てください。
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
でコンパイルした後javac -g:vars TestLocalVarNames.java
、ローカル変数の名前は.classファイルにあります。javap
の-l
フラグ(「行番号とローカル変数テーブルを印刷する」)はそれらを表示できます。
javap -l -c TestLocalVarNames
ショー:
class TestLocalVarNames extends java.lang.Object{
TestLocalVarNames();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTestLocalVarNames;
public java.lang.String aMethod(int);
Code:
0: ldc #2; //String a string
2: astore_2
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: astore_3
11: aload_3
12: aload_2
13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: iload_1
17: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
20: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 24 0 this LTestLocalVarNames;
0 24 1 arg I
3 21 2 local1 Ljava/lang/String;
11 13 3 local2 Ljava/lang/StringBuilder;
}
VMの仕様では、私たちがここで見ているものを説明します。
§4.7.9 LocalVariableTable
属性:
このLocalVariableTable
属性は、Code
(§4.7.3)属性のオプションの可変長属性です。デバッガーは、メソッドの実行中に特定のローカル変数の値を決定するために使用できます。
LocalVariableTable
店舗各スロット内の変数の名前と型なので、バイトコードでそれらを一致させることができます。これは、デバッガーが「式を評価する」方法です。
ただし、エリクソンが言ったように、通常のリフレクションを介してこのテーブルにアクセスする方法はありません。まだこれを行うと決心している場合は、Javaプラットフォームデバッガアーキテクチャ(JPDA)が役立つと思います(ただし、自分で使用したことはありません)。