,这是一个示例:
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;
开始和长度是什么意思?长度为什么具有其价值?为什么相等类型(整数)的长度有所不同?为什么可以更改长度,当我在不触摸特定本地变量的情况下添加某些内容并重新编译它?
启动是可见此变量的启动字节偏移。长度是该变量可见的字节码字节的数量。通常,启动点指向首先分配变量的字节码指令或用于方法参数和this
的0。在您的情况下,似乎所有变量都有效到该方法的末端(每个变量的start+length = 133
),但是如果您在块内声明某些变量,则它们的范围将较短。
请注意,本地变量表(LVT)是可选的调试信息。程序执行不是必需的,可以在编译过程中使用-g:none
关闭。该表的主要目的是使调试更加方便:拥有它可以确定当前可见变量的每个字节码位置,以在变量窗格中显示它们并将其隐藏在变量范围内。此外,Java分解器和代码分析仪(例如FindBugs)都使用了此表。
根据jsl
在局部变异表中
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
代码属性,必须是指令opcode的索引。
The value of start_pc + length must either be a valid index into
此代码属性的代码数组,并成为OPCODE的索引指令,否则它必须是该代码数组末尾的第一个索引。
因此,基本上开始对应于您的LineNumberTable