Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM常量池条目_Java_Jvm_Jvm Bytecode - Fatal编程技术网

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)。

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

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

这些常量是否在任何地方使用?提示,提示?它们是各种属性的名称,例如
LocalVariableTable
,但我不明白为什么它们必须是UTF-8字符串而不是简单的数字ID。你是说像
34
?使用命名字段使格式更易于扩展和理解。您自己已经回答了这个问题。这些是与对应的类属性的名称。除了预定义的属性外,还可以有自定义属性,将来可能会出现新属性,因此文本名称似乎更适合。扩展是关键,如JVMS 4.7.1中所述:
两个属性本来是不同的,但恰好使用相同的属性名且长度相同,将在识别任一属性的实现上发生冲突。除本规范中定义的属性外,必须根据Java语言规范Java SE 7版(JLS§6.1)中描述的包命名约定选择名称。
不能使用数值。