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

dhb*_*lah 4 java jvm bytecode bytecode-manipulation java-bytecode-asm

所以这是一个例子:

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;
Run Code Online (Sandbox Code Playgroud)

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

Tag*_*eev 9

Start是此变量可见的起始字节码偏移量.长度是此变量可见的字节码字节数.通常从指向首先分配变量的字节码指令开始,或者指向方法参数的0和0 this.在你的情况下,似乎所有变量对方法的末尾都是有效的(start+length = 133对于每个变量),但是如果你在块中声明一些变量,它们的范围将会更短.

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