3

查看在某些类上运行的输出javap,我遇到了以下奇怪现象:

一些类的常量池包含诸如

#33 = Utf8               Code
#34 = Utf8               LocalVariableTable
#35 = Utf8               StackMapTable
#36 = Utf8               MethodParameters

为什么这些常量会出现在常量池中?

4

1 回答 1

2

以下常数

#33 = Utf8               Code
#34 = Utf8               LocalVariableTable
#35 = Utf8               StackMapTable
#36 = Utf8               MethodParameters

属性的名称。

对于所有属性,attribute_name_index 必须是类常量池中的有效无符号 16 位索引。attribute_name_index 处的 constant_pool 条目必须是表示属性名称的 CONSTANT_Utf8_info 结构(第 4.4.7 节)。

您提到的属性具有以下功能:

  • 属性包含CodeJava虚拟机指令和方法的辅助信息,包括实例初始化方法或类或接口初始化方法。
  • LocalVariableTable调试器可以使用属性 [...] 在方法执行期间确定给定局部变量的值。
  • StackMapTable在通过类型检查进行验证的过程中使用了一个属性
  • MethodParameters属性记录有关方法的形式参数的信息,例如它们的名称。
于 2015-05-05T20:12:05.050 回答