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



,这是一个示例:

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

最新更新