从Java Virtual Machine specification:
class
文件由8位字节的流组成。通过分别读取两个,四个和八个连续的8位字节来构造所有16位,32位和64位量。多字节数据项始终以高字节顺序存储,高字节在前。在Java平台中,接口java.io.DataInput和java.io.DataOutput
以及类java.io.DataInputStream和java.io.DataOutputStream支持这种格式。
本章定义了自己的代表class
文件数据的数据类型集:类型u1
,u2
和u4
分别表示无符号的一个,两个或四个字节的数量。在Java平台中,可以通过接口readUnsignedByte
的readUnsignedShort
,readInt
和java.io.DataInput
之类的方法读取这些类型。
除了烦人地提到“ 64位数量”(没有u8
,long and double分为两个u4
项)之外,我不知道如何处理u4
类型。
对于u1
和u2
很明显:u1
:用readUnsignedByte
读取,存储在int
中u2
:用readUnsignedShort
读取,存储在int
中
规范建议:u4
:用readInt
读取,存储在int
中(?)
大于Integer.MAX_VALUE
的值会怎样?这个建议是否默默地暗示所有u4
类型的值都小于或等于Integer.MAX_VALUE
?
我想到了这个主意:u4
:用readUnsignedInt
读取,存储在long
中
不幸的是,there is no such method。但这不是问题,因为您可以轻松编写自己的代码:
public long readUnsignedInt() throws IOException {
return readInt() & 0xFFFFFFFFL;
}
因此,这里有两个值得怀疑的地方:
Code attribute:
Code_attribute {
...
u4 code_length;
u1代码[code_length];
...
}
为什么
code_length
不是u2
类型? Later it says:code_length
项的值必须小于65536。SourceDebugExtension attribute:
SourceDebugExtension_attribute {
...
u4 attribute_length;
u1 debug_extension [attribute_length];
}
...
请注意,
debug_extension
数组表示的字符串可能长于用类String
的实例可以表示的字符串。为什么?
u4
的值是否确实可以超过Integer.MAX_VALUE
(因为我认为这是String
实例的最大长度)? 最佳答案
如果需要,可以轻松解除64K代码长度限制。
由于没有提到u4值不能超过Integer.MAX_VALUE,因此必须假定u4值可以超过Integer.MAX_VALUE。 JVM规范没有任何隐含内容。