( Editar: se eliminaron dos respuestas anteriores, una por responder la pregunta tal como estaba antes de las ediciones y otra por estar, si no está absolutamente equivocada, al menos cerca de ella. )
Si compila con información de depuración en ( javac -g
), los nombres de las variables locales se mantienen en el archivo .class. Por ejemplo, tome esta clase simple:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Después de compilar con javac -g:vars TestLocalVarNames.java
, los nombres de las variables locales ahora están en el archivo .class. javap
El -l
indicador ("Imprimir número de línea y tablas de variables locales") puede mostrarlas.
javap -l -c TestLocalVarNames
muestra:
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;
}
La especificación de VM explica lo que estamos viendo aquí:
§4.7.9 El LocalVariableTable
atributo :
El LocalVariableTable
atributo es un atributo opcional de longitud variable de un atributo Code
(§4.7.3). Los depuradores pueden usarlo para determinar el valor de una variable local dada durante la ejecución de un método.
Las LocalVariableTable
tiendas de los nombres y tipos de las variables en cada ranura, por lo que es posible igualar para arriba con el código de bytes. Así es como los depuradores pueden hacer "Evaluar expresión".
Sin embargo, como dijo Erickson, no hay forma de acceder a esta tabla a través de la reflexión normal. Si todavía está decidido a hacer esto, creo que la arquitectura Java Platform Debugger Architecture (JPDA) ayudará (pero nunca la he usado yo mismo).