📚《深入浅出JVM字节码》
《Java虚拟机字节码:从入门到实战》的开源版本。作者通过自己的实战经验,整合出一套适合新手的高效学习教程。归纳并提炼知识点,制定合理路线,帮助读者更快掌握核心技术。
字段结构和方法结构也都有属性表,所以要注意不要将这些属性表混在一起理解。但所有属性都有一个通用的结构,这在解析字段那部分已经介绍。因此,解析class文件结构的属性表我们也可以使用通用的属性结构来解析。
解析步骤是先从class文件字节缓存中读取两个字节,如果前面的解析工作都正常,那么现在读取到的这两个字节就是该class文件属性表的长度。接着根据长度创建属性表,使用通用属性结构循环解析出每个属性,循环次数为属性的总数。
class文件结构的属性表解析器AttributesHandler 的实现代码如下。
public class AttributesHandler implements BaseByteCodeHandler {
@Override
public int order() {
return 8;
}
@Override
public void read(ByteBuffer codeBuf, ClassFile classFile) throws Exception {
classFile.setAttributes_count(new U2(codeBuf.get(), codeBuf.get()));
// 获取属性总数
int len = classFile.getAttributes_count().toInt();
if (len == 0) {
return;
}
// 创建属性表
AttributeInfo[] attributeInfos = new AttributeInfo[len];
classFile.setAttributes(attributeInfos);
for (int i = 0; i < len; i++) {
// 创建属性
AttributeInfo attributeInfo = new AttributeInfo();
attributeInfos[i] = attributeInfo;
// 解析属性
attributeInfo.setAttribute_name_index(new U2(codeBuf.get(), codeBuf.get()));
attributeInfo.setAttribute_length(new U4(codeBuf.get(), codeBuf.get(), codeBuf.get(), codeBuf.get()));
int attr_len = attributeInfo.getAttribute_length().toInt();
if (attr_len == 0) {
continue;
}
// 解析属性的info项
byte[] bytes = new byte[attr_len];
codeBuf.get(bytes, 0, bytes.length);
attributeInfo.setInfo(bytes);
}
}
}
与其它解析器一样,在编写完成属性表解析器后,我们还需要将class文件结构的属性表解析器AttributesHandler 注册到ClassFileAnalysiser。
发布于:2021 年 07 月 24 日
作者: 吴就业
链接: https://github.com/wujiuye/JVMByteCodeGitBook
来源: Github Pages 开源电子书《深入浅出JVM字节码》(《Java虚拟机字节码从入门到实战》的第二版),未经作者许可,禁止转载!
📚目录
订阅
订阅新文章发布通知吧,不错过精彩内容!
输入邮箱,提交后我们会给您发送一封邮件,您需点击邮件中的链接完成订阅设置。