Java JVM常量池条目
查看在某些类上运行Java JVM常量池条目,java,jvm,jvm-bytecode,Java,Jvm,Jvm Bytecode,查看在某些类上运行javap的输出,我发现了以下奇怪之处: 某些类的常量池包含以下项: #33 = Utf8 Code #34 = Utf8 LocalVariableTable #35 = Utf8 StackMapTable #36 = Utf8 MethodParameters 为什么这些常量出现在常量池中?以下常量 #33 = Utf8 Code
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
你的名字是什么
对于所有属性,属性\名称\索引必须是类的常量池中的有效无符号16位索引属性名称索引中的常量池项必须是表示属性名称的常量Utf8信息结构(§4.4.7)。
您提到的属性具有以下功能:
属性包含Java虚拟机指令和方法的辅助信息,包括实例初始化方法或类或接口初始化方法code
- 调试器可以使用
属性[…],在方法执行期间确定给定局部变量的值LocalVariableTable
- 在通过类型检查进行验证的过程中使用
属性StackMapTable
属性记录有关方法的形式参数的信息,例如它们的名称MethodParameters
LocalVariableTable
,但我不明白为什么它们必须是UTF-8字符串而不是简单的数字ID。你是说像34
?使用命名字段使格式更易于扩展和理解。您自己已经回答了这个问题。这些是与对应的类属性的名称。除了预定义的属性外,还可以有自定义属性,将来可能会出现新属性,因此文本名称似乎更适合。扩展是关键,如JVMS 4.7.1中所述:两个属性本来是不同的,但恰好使用相同的属性名且长度相同,将在识别任一属性的实现上发生冲突。除本规范中定义的属性外,必须根据Java语言规范Java SE 7版(JLS§6.1)中描述的包命名约定选择名称。
不能使用数值。