class文件里的LocalVariableTable

用eclipse调试程序时,有时会碰到打上断点后,无法看到变量真实名称,改而是arg0、arg1这类无意义的。参看以下代码:

private Test fn(String s){
String y="123";
System.out.println("123");
return null;
}

通过javap查看编译后的字节码

private Test fn(java.lang.String);
Code:
Stack=2, Locals=3, Args_size=2
0: ldc #35; //String 123
2: astore_2
3: getstatic #37; //Field java/lang/System.out:Ljava/io/PrintStream;
6: ldc #35; //String 123
8: invokevirtual #43; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
11: aconst_null
12: areturn
LineNumberTable:
line 11: 0
line 12: 3
line 13: 11
LocalVariableTable:
Start Length Slot Name Signature
0 13 0 this LTest;
0 13 1 s Ljava/lang/String;
3 10 2 y Ljava/lang/String;
}

在最后的LocalVariableTable一栏中,明显看到Name对应的一栏,有参数名及局部变量名。
但如果不用eclipse,直接在命令行里通过javac编译,会发现LocalVariableTable是空的。一般为了效率,正式发包的jar包是不含这一栏的,因此在调试此类代码时,就只能看到arg0之类的变量。

还有一种情况,若代码(往往是第三方包)依赖了LocalVariableTable,则可能引起问题。以nutz的@Param为例,当Module层里的@At接口没有声明@Param时,此时其会读取对应class文件的LocalVariableTable,试图从class文件中得到参数名,以便对应为前提提交的参数名。eclipse下默认编译带LocalVariableTable,因此不写@Param可行,但通过javac编译时,会出现参数无法接收的情况。

你可能感兴趣的:(class文件里的LocalVariableTable)