( Editar: duas respostas anteriores removidas, uma por responder à pergunta como estava antes das edições e outra por estar, se não absolutamente errada, pelo menos próxima a ela. )
Se você compilar com informações de depuração em ( javac -g
), os nomes das variáveis locais serão mantidos no arquivo .class. Por exemplo, pegue esta classe simples:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Após compilar com javac -g:vars TestLocalVarNames.java
, os nomes das variáveis locais agora estão no arquivo .class. javap
O -l
sinalizador ("Número da linha de impressão e tabelas de variáveis locais") pode mostrá-los.
javap -l -c TestLocalVarNames
mostra:
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;
}
A especificação da VM explica o que estamos vendo aqui:
§4.7.9 O LocalVariableTable
atributo :
O LocalVariableTable
atributo é um atributo opcional de comprimento variável de um atributo Code
(§4.7.3). Pode ser usado por depuradores para determinar o valor de uma determinada variável local durante a execução de um método.
Ele LocalVariableTable
armazena os nomes e tipos das variáveis em cada slot, para que seja possível combiná-los com o bytecode. É assim que os depuradores podem fazer "Avaliar expressão".
Como disse Erickson, no entanto, não há como acessar esta tabela através da reflexão normal. Se você ainda estiver determinado a fazer isso, acredito que a JPDA (Java Platform Debugger Architecture) ajudará (mas nunca a usei).