编译生成的.class文件中变量显示为var0的原因探究
为什么反编译后的类文件里变量名变成了var0?
这事儿本质是Java编译和字节码存储的机制问题:
- 用默认
javac命令编译生成的.class文件,不会保存局部变量和方法参数的原始名称。JVM执行字节码只关心变量的类型、存储位置,完全不需要知道它叫args还是repeats,所以编译器默认会把这些名称丢弃,换成var0、var1这类按顺序编号的占位符。 - 你看到的反编译代码里的
var0,就是反编译器在找不到原始参数名时,自动套用的默认命名规则——按参数出现的顺序从0开始编号。
如果想让反编译后还能看到原始参数名,编译时要加上调试参数:
javac -g:vars StackOverflowExample.java
加上-g:vars后,class文件会额外存储局部变量表信息,反编译工具就能读取到原始的args、repeats这些名称了。
原始Java代码
public class StackOverflowExample { public static void main(String[] args) { loop(50_000); System.out.println("Success!"); } public static void loop(int repeats) { if (repeats > 0) { loop(repeats - 1); } } }
反编译后的.class文件代码
public class StackOverflowExample { public StackOverflowExample() { } public static void main(String[] var0) { loop(50000); System.out.println("Success!"); } public static void loop(int var0) { if (var0 > 0) { loop(var0 - 1); } } }
内容的提问来源于stack exchange,提问作者Artyom
相关产品推荐
相关产品推荐

