Dies ist eine interessante Frage. Aber was ist der Zweck? Ist es nur eine Übung?
Ja, das Abrufen lokaler Variablennamen ist unter bestimmten Bedingungen möglich.
Laut einigen Definitionen sind Funktionsparameter in Java eine Art lokale Variable. Sie können diese erhalten, wenn der Code mit Debug-Informationen kompiliert wurde, mit Java-Reflektion, method.getParameterTypes()
Wenn Sie eine .class-Datei mit Debug-Informationen kompiliert haben, können Sie die lokalen Variablen daraus lesen, zum Beispiel mit asm's ClassReader. Der folgende Code sieht bei den Einheimischen der Klasse A die Funktion f1
Hier ist der Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
public class Example {
public static void main(String[] args) throws FileNotFoundException, IOException {
ClassReader reader = new ClassReader(new FileInputStream(new File("A.class")));
final ClassNode classNode = new ClassNode();
reader.accept((ClassVisitor) classNode, 0);
for (final MethodNode mn : (List<MethodNode>)classNode.methods) {
if (mn.name.equals("f1"))
for (LocalVariableNode n : (List<LocalVariableNode>)mn.localVariables) {
System.out.println(n.name);
}
}
}
}
- Ich bin darüber nicht sicher, aber Ich denke, Sie könnten es auch mit der LocalVariable-Klasse der Java-Debug-Schnittstelle
Nein. Variablennamen sind nur für den Programmierer Bequemlichkeit; Der Compiler wirft sie weg. –
Überlegen Sie, was Sie denken, dass es für 'printLocalVariables (1, eins + 1) drucken soll;'. –
Sie können jedoch eine Speicherortsrepräsentation abrufen. So könnte "Eins" @ 2123d517 werden und Sie könnten diesen "Zeiger" vor und zurück verfolgen. Wenn es der gleiche Wert ist, dann ist es die gleiche Variable in diesem Kontext. – Bonatti