查看在某些类上运行的输出javap
,我遇到了以下奇怪现象:
一些类的常量池包含诸如
#33 = Utf8 Code
#34 = Utf8 LocalVariableTable
#35 = Utf8 StackMapTable
#36 = Utf8 MethodParameters
为什么这些常量会出现在常量池中?
查看在某些类上运行的输出javap
,我遇到了以下奇怪现象:
一些类的常量池包含诸如
#33 = Utf8 Code
#34 = Utf8 LocalVariableTable
#35 = Utf8 StackMapTable
#36 = Utf8 MethodParameters
为什么这些常量会出现在常量池中?
以下常数
#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 节)。
您提到的属性具有以下功能:
Code
Java虚拟机指令和方法的辅助信息,包括实例初始化方法或类或接口初始化方法。LocalVariableTable
调试器可以使用属性 [...] 在方法执行期间确定给定局部变量的值。StackMapTable
在通过类型检查进行验证的过程中使用了一个属性MethodParameters
属性记录有关方法的形式参数的信息,例如它们的名称。