来自Java 虚拟机规范:
一个
class
文件由一个 8 位字节流组成。所有 16 位、32 位和 64 位量都是通过分别读取两个、四个和八个连续的 8 位字节来构造的。多字节数据项始终以大端顺序存储,高字节在先。java.io.DataOutput
在 Java 平台中,接口 java.io.DataInput 和java.io.DataInputStream 和 java.io.DataOutputStream 等类都支持这种格式。本章定义了自己的一组表示
class
文件数据的数据类型:类型u1
、u2
和u4
分别表示无符号的一、二或四字节数量。在 Java 平台中,这些类型可以通过接口的readUnsignedByte
、readUnsignedShort
、 和等方法读取。readInt
java.io.DataInput
除了提到“64 位数量”(没有u8
、long 和 double分为两个u4
项目)之外,我不明白如何处理该u4
类型。
很u1
明显u2
:
u1
: 读取readUnsignedByte
,存储在int
u2
: 读取readUnsignedShort
,存储在int
该规范建议这样做:
u4
: 读取readInt
,存储在int
(?)
大于 的值会发生什么Integer.MAX_VALUE
?这个建议是否暗示所有类型的值u4
都小于或等于Integer.MAX_VALUE
?
我想出了这个主意:
u4
: 读取readUnsignedInt
,存储在一个long
不幸的是,没有这样的方法。但这不是问题,因为您可以轻松编写自己的:
public long readUnsignedInt() throws IOException {
return readInt() & 0xFFFFFFFFL;
}
所以,这里有两个值得怀疑的地方:
代码属性:
Code_attribute {
...
u4 code_length;
u1 代码[code_length];
...
}为什么
code_length
不是类型u2
?后来它说:该
code_length
项目的值必须小于 65536。SourceDebugExtension属性:
SourceDebugExtension_attribute {
...
u4 attribute_length;
u1 debug_extension[attribute_length];
...请注意,该
数组表示的字符串可能比用 class 的实例表示的字符串长。
debug_extension
String
为什么?值确实可以
u4
超过Integer.MAX_VALUE
(因为我认为这是String
实例的最大长度)?