来自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、 和等方法读取。readIntjava.io.DataInput
除了提到“64 位数量”(没有u8、long 和 double分为两个u4项目)之外,我不明白如何处理该u4类型。
很u1明显u2:
u1: 读取readUnsignedByte,存储在intu2: 读取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_extensionString为什么?值确实可以
u4超过Integer.MAX_VALUE(因为我认为这是String实例的最大长度)?