這是一個有趣的問題。但是目的是什麼?這只是一個練習嗎?
是,編程變得局部變量名在一定條件下是可能的。
根據一些定義,在java中,函數參數是一種局部變量。如果使用調試信息編譯代碼,使用java反射,您可以獲得這些代碼。method.getParameterTypes()
如果您有一個用調試信息編譯的.class文件,您可以從中讀取它的局部變量,例如使用asm的ClassReader。 下面的代碼看起來在A類的函數f1
這裏的當地人是代碼:
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);
}
}
}
}
- 我不知道這一點,但我想,你也可以做一個使用LocalVariable類的Java調試接口
號變量名的它僅僅是那裏的程序員的方便;編譯器將它們拋出。 –
考慮一下你認爲應該爲printLocalVariables(1,one + 1)打印的內容。 –
但是,您可以獲取內存位置表示。所以,「one」可以變成@ 2123d517,你可以來回追蹤這個「指針」。如果它在這種情況下具有相同的值,那麼它是相同的變量。例如, – Bonatti