LocalVariableTable 中的 'start' 和 'length' 属性是什么意思

What do 'start' and 'length' attribute in LocalVariableTable mean

下面是示例:

LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0     133     0  this   Lcom/my/class/Test;
               2     131     1     a   I
               4     129     2     b   I
               7     126     3     i   I
              10     123     4    i2   I
              16     117     5    o1   Ljava/lang/Integer;
              31     102     6    o2   Ljava/lang/Integer;

开始和长度是什么意思?为什么 length 具有它所具有的值?为什么相同类型(整数)的长度不同?为什么可以更改长度,当我向 class 添加一些内容并在不触及该特定局部变量的情况下重新编译它时?

Start 是此变量可见的起始字节码偏移量。长度是该变量可见的字节码字节数。通常 start 指向变量第一次被赋值的字节码指令,或者对于方法参数和 this 指向 0。在您的情况下,似乎所有变量在方法结束时都有效(start+length = 133 对于每个变量),但是如果您在块内声明一些变量,它们的范围会更短。

注意局部变量table(LVT)是一个可选的调试信息。它不是程序执行所必需的,可以在编译期间使用 -g:none 关闭。这个 table 的主要目的是使调试更方便:有了它,您可以为每个字节码位置确定哪些变量当前可见,以便在变量窗格中显示它们,并在您离开变量范围后隐藏它们。 table 也被 java 反编译器和代码分析器(如 FindBugs)使用。

根据jsl

内部变量 Table

u2 local_variable_table_length;
    {   u2 start_pc;
        u2 length;
        u2 name_index;
        u2 descriptor_index;
        u2 index;
    }

local_variable_table数组中的每一项表示代码数组的范围 局部变量具有值的偏移量。它还表示索引 进入当前帧的局部变量数组,在该数组中可以找到该局部变量。

现在对于你的开始和长度属性 JSL 说

start_pc,长度

The given local variable must have a value at indices into the code 

数组在区间[start_pc,start_pc+长度)之间,即 start_pc 包含且 start_pc + 长度不包含。

The value of start_pc must be a valid index into the code array of this 

代码属性,必须是指令操作码的索引。

The value of start_pc + length must either be a valid index into 

该Code属性的code数组,作为opcode的索引 一条指令,或者它必须是超出该代码数组末尾的第一个索引。

所以基本上开始对应你的LineNumberTable