( Modifier: deux réponses précédentes supprimées, une pour répondre à la question telle qu'elle se présentait avant les modifications et une pour être, si ce n'est absolument faux, du moins proche. )
Si vous compilez avec les informations de débogage sur ( javac -g
), les noms des variables locales sont conservés dans le fichier .class. Par exemple, prenez cette classe simple:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Après la compilation avec javac -g:vars TestLocalVarNames.java
, les noms des variables locales sont maintenant dans le fichier .class. javap
de-l
indicateur de ("Imprimer le numéro de ligne et les tables de variables locales") peut les afficher.
javap -l -c TestLocalVarNames
spectacles:
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 spécification VM explique ce que nous voyons ici:
§4.7.9 L' LocalVariableTable
attribut :
le LocalVariableTable
attribut est un attribut de longueur variable facultatif d'un attribut Code
(§4.7.3). Il peut être utilisé par les débogueurs pour déterminer la valeur d'une variable locale donnée lors de l'exécution d'une méthode.
le LocalVariableTable
stocke les noms et les types des variables dans chaque emplacement, il est donc possible de les faire correspondre avec le bytecode. C'est ainsi que les débogueurs peuvent faire "Evaluate expression".
Comme l'a dit Erickson, cependant, il n'y a aucun moyen d'accéder à cette table par une réflexion normale. Si vous êtes toujours déterminé à le faire, je pense que l' architecture du débogueur de plate-forme Java (JPDA) vous aidera (mais je ne l'ai jamais utilisée moi-même).