在 javap -v
反编译的字节码中,LocalVariableTable
用于描述方法中 局部变量的作用域、存储位置和类型信息。以下是各参数的含义和示例说明:
1. Start
(起始指令偏移量)
- 含义:该局部变量 开始生效 的字节码指令偏移量(从0开始计数)。
- 示例:
public void test(int a) { int b = 10; // 假设b从偏移量2开始生效 System.out.println(b); }
- 变量
b
的Start=2
,表示从第2条字节码指令开始可以访问b
。
- 变量
2. Length
(作用域长度)
- 含义:该局部变量 有效的指令范围长度(从
Start
开始的连续指令数)。 - 计算方式:
Start + Length
表示变量最后有效的指令偏移量(不包含该偏移量本身)。 - 示例:
public void test(int a) { int b = 10; // Start=2, Length=5 System.out.println(b); // b在偏移量2到6(2+5-1)之间有效 }
3. Slot
(局部变量槽位)
- 含义:变量在 局部变量表(Local Variable Table) 中的存储位置索引。
- 分配规则:
- 实例方法:
Slot 0
固定为this
,后续槽位依次存放参数和局部变量。 - 静态方法:
Slot 0
开始存放参数和局部变量。
- 实例方法:
- 示例:
public void test(int a, String s) { int b = 10; // Slot分配: // 0: this, 1: a, 2: s, 3: b }
4. Name
(变量名称)
- 含义:变量在源代码中的 名称(由编译器保留,若未混淆)。
- 示例:
public void example(String param) { int localVar = 20; // Name分别为 param 和 localVar }
5. Signature
(类型签名)
-
含义:变量的 类型描述符,使用 JVM 类型表示法。
-
常见类型符号:
类型 描述符 int
I
long
J
double
D
String
Ljava/lang/String;
int[]
[I
Object
Ljava/lang/Object;
-
示例:
public void test(int a, String s) { // Signature: // a -> I // s -> Ljava/lang/String; }
完整示例分析
源代码
public class Demo {
public static void main(String[] args) {
int x = 10;
System.out.println(x);
}
}
反编译后的 LocalVariableTable
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 args [Ljava/lang/String; // 参数args(String数组)
2 5 1 x I // 局部变量x(int)
解读
-
args
参数Start=0
:从第0条指令开始生效。Length=7
:作用域覆盖7条指令(0到6)。Slot=0
:存储在局部变量表第0位。Signature=[Ljava/lang/String;
:类型为String[]
。
-
局部变量
x
Start=2
:从第2条指令开始生效(假设赋值操作在偏移量2)。Length=5
:作用域覆盖5条指令(2到6)。Slot=1
:存储在局部变量表第1位。Signature=I
:类型为int
。
总结
参数 | 作用 | 示例值 |
---|---|---|
Start | 变量生效的起始指令偏移量 | 0 , 2 |
Length | 变量有效的指令范围长度 | 7 , 5 |
Slot | 变量在局部变量表中的存储位置 | 0 (this或参数) |
Name | 变量在源代码中的名称 | args , x |
Signature | 变量的类型描述符(JVM表示法) | I , Ljava/lang/String; |
通过这些参数,可以精确追踪方法执行过程中每个局部变量的 生命周期 和 内存分配,对调试和性能优化至关重要。