LocalVariableTable 参数详解

在 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 类型表示法。

  • 常见类型符号

    类型描述符
    intI
    longJ
    doubleD
    StringLjava/lang/String;
    int[][I
    ObjectLjava/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)
解读
  1. args 参数

    • Start=0:从第0条指令开始生效。
    • Length=7:作用域覆盖7条指令(0到6)。
    • Slot=0:存储在局部变量表第0位。
    • Signature=[Ljava/lang/String;:类型为 String[]
  2. 局部变量 x

    • Start=2:从第2条指令开始生效(假设赋值操作在偏移量2)。
    • Length=5:作用域覆盖5条指令(2到6)。
    • Slot=1:存储在局部变量表第1位。
    • Signature=I:类型为 int

总结

参数作用示例值
Start变量生效的起始指令偏移量02
Length变量有效的指令范围长度75
Slot变量在局部变量表中的存储位置0(this或参数)
Name变量在源代码中的名称argsx
Signature变量的类型描述符(JVM表示法)ILjava/lang/String;

通过这些参数,可以精确追踪方法执行过程中每个局部变量的 ​生命周期 和 ​内存分配,对调试和性能优化至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值