Java虚拟机字节码:从入门到实战
上QQ阅读APP看书,第一时间看更新

解析魔数

根据表2-1可知,魔数占四个字节,它只是用来确定这个文件是否是一个class文件。魔数固定值为0xCAFEBABE,这个值永远不会改变。

魔数解析的实现很简单,只需要从class文件字节缓存中连续读取四个字节,将这四个字节转为U4对象,并赋值给ClassFile对象的magic字段。魔数解析器的实现如代码清单2-7所示。

代码清单2-7 魔数解析器

public class MagicHandler implements BaseByteCodeHandler {
   // 排序排在第一个
    @Override
    public int order() {
        return 0;
    }

    @Override
public void read(ByteBuffer codeBuf, ClassFile classFile) throws Exception {
  // 连续读取四个字节并转为U4对象
        classFile.setMagic(new U4(codeBuf.get(), codeBuf.get(),codeBuf.get(), codeBuf.get()));
        if (!"0xCAFEBABE".equalsIgnoreCase(classFile.getMagic() .toHexString())) {
            throw new Exception("这不是一个Class文件");
        }
    }

}