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
下面是示例:
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