5

javap关于常量池命令生成的输出的小问题。打印池时javap,它将字符串常量定义为Asciz字符串,我理解这意味着null终止的 Ascii:

const #20 = Asciz       hello world;

这意味着字符串的长度是未知的,并且要解析,您将读取每个字节,直到遇到null.

但是,常量池字符串常量的长度是由字符串前面的两个字节定义的,没有null附加。(常量池规范)。

是否javap将字符串定义为Asciz不正确或Asciz有其他我不知道的含义?

4

2 回答 2

4

请参阅错误 #6868539。它已在 OpenJDK7 中修复,现在改为javap打印Utf8

于 2011-11-20T10:59:35.047 回答
0

const #20 不是实际的字符串,而是用于您的字符串的 UTF8 定义的字符。您可能有另一个常量,它是一个引用常量#20 的字符串。asciz 常量用于字符串以外的其他内容,例如字段名称等。实际信息包含 UTF8 标记、长度和字节。

请参阅http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

于 2011-11-20T10:49:53.977 回答