查看在某些类上运行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
属性记录有关方法的形式参数的信息,例如它们的名称