上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文件"); } } }