Java Virtual Machine specification


  class文件由8位字节的流组成。通过分别读取两个,四个和八个连续的8位字节来构造所有16位,32位和64位量。多字节数据项始终以高字节顺序存储,高字节在前。在Java平台中,接口java.io.DataInput和java.io.DataOutput以及类java.io.DataInputStream和java.io.DataOutputStream支持这种格式。
  
  本章定义了自己的代表class文件数据的数据类型集:类型u1u2u4分别表示无符号的一个,两个或四个字节的数量。在Java平台中,可以通过接口readUnsignedBytereadUnsignedShortreadIntjava.io.DataInput之类的方法读取这些类型。


除了烦人地提到“ 64位数量”(没有u8long and double分为两个u4项)之外,我不知道如何处理u4类型。

对于u1u2很明显:


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规范没有任何隐含内容。

10-08 11:03