当前位置: 首页 > news >正文

解析Java中的class文件

解析class文件需要把class文件当成文件流来处理,定义ClassReader结构体

type ClassReader struct {data []byte
}

go语言中的reslice语法可以跳过已经读过的数据。

同时定义了ClassFile数据结构来描述class文件的各个部分,该数据结构如下所示:

type ClassFile struct { //magic uint32 minorVersion uint16 majorVersion uint16 constantPool ConstantPool accessFlags uint16 thisClass uint16 superClass uint16 interfaces []uint16 fields []*MemberInfo methods []*MemberInfo attributes []AttributeInfo } 

ClassFile结构体如实反映了Java虚拟机规范定义的class文件格式。

class文件的魔数为0xCAFEBABE占四个字节

minorVersion为class文件的次版本号

majorVersion为class文件的主版本号

constantPool为常量池

acessFlags为class的可访问标识

thisClass和superClass都为常量池的索引

interfaces为接口索引表,该表存放的是常量池的索引

fields为类的字段表

methods为类的方法表

attributes为类的属性表

常量池

顾名思义,常量池中存放了各种各样的常量信息,包括数字和字符串常量、类和接口名、字段和方法名,等等。

因为常量池中存放的信息各不相同,所以每种常量的格式也不同。常量数据的一个字节是tag,用来区别常量的类型。下面是Java虚拟机给出的常量结构:

cp_info {u1 tag;u1 info[];
}

可以将常量池中的常量分为两类:字面量和符号引用。字面量包括数字常量和字符串常量,符号引用包括类和接口名、字段和方法信息等。除了字面量,其他常量都是通过索引直接或间接指向CONSTANT_Utf8_info常量。
常量引用关系

属性表

属性表存放着方法的字节码,因为虚拟机中的属性是可以扩展的,不同虚拟机实现可以定义自己的属性类型。由于这个原因,Java虚拟机使用属性名来区分不同的属性。属性结构定义如下所示:

attribute_info {u2 attribute_name_index;u4 attribute_length;u1 info[attribute_length];
}

按照用途,23种预定义属性可以分为三组。第一组属性是实现Java虚拟机所必须的,共有5种;第二组属性是Java类库所必需的,共有12种;第三组属性主要提供给工具使用,共有6种。第三组属性是可选的。
预定义属性

code属性

Code是变长属性,只存在于method_info结构种。Code属性中存放字节码等方法相关信息,其结构定义如下所示:

Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{   u2 start_pc;u2 end_pc;u2 handler_pc;u2 catch_type;
} exception_table[exception_table_length];
u2 attribattribute_info attributes[attributes_count];
}
utes_count;

max_stack 给出操作数栈的最大深度,max_locals给出局部变量大小。接下来就是字节码,异常处理表和局部变量表。

http://www.lryc.cn/news/15887.html

相关文章:

  • 直播预告 | 企业如何轻松完成数据治理?火山引擎 DataLeap 给你一份实战攻略!
  • 华为OD机试真题Python实现【 磁盘容量】真题+解题思路+代码(20222023)
  • php调试配置
  • Spring架构篇--1 项目演化过程
  • 华为OD机试真题Python实现【斗地主 2】真题+解题思路+代码(20222023)
  • Intel SIMD: AVX2
  • Spring Cloud Nacos源码讲解(二)- Nacos客户端服务注册源码分析
  • 华为OD机试 - 停车场最大距离(Python) | 机试题+算法思路+考点+代码解析 【2023】
  • RPC(2)------ Netty(NIO) + 多种序列化协议 + JDK动态代理实现
  • CAN现场总线基础知识总结,看这一篇就理清了(CAN是什么,电气属性,CAN通协议等)
  • 盘点全网好评最多的7款团队协同软件,你用过哪款?
  • Node-RED 3.0升级,新增特性介绍
  • 使用带有 Moveit 的深度相机来避免碰撞
  • 干货复试详细教程——从联系导师→自我介绍的复试教程
  • Java 优化:读取配置文件 “万能方式“ 跨平台,动态获取文件的绝对路径
  • 华为OD机试真题Python实现【最小施肥机能效】真题+解题思路+代码(20222023)
  • python基于vue健身房课程预约平台
  • Allegro无法看到金属化孔的钻孔的原因和解决办法
  • 《蓝桥杯每日一题》并查集·AcWing1249. 亲戚
  • 亚马逊云科技依托人工智能进行游戏数据分析,解决游戏行业痛点,助力游戏增长
  • 为什么不建议用 equals 判断对象相等?
  • 手写线程池实例并测试
  • 实操go开发环境的配置
  • 华为OD机试真题Python实现【匿名信】真题+解题思路+代码(20222023)
  • 阿里淘系面试经历(一)
  • matplotlib绘制三维图
  • 4万字c++讲解+区分c和c++,不来可惜了(含代码+解析)
  • AcWing 482. 合唱队形
  • Pytorch深度学习实战3-4:通俗理解张量Tensor的爱因斯坦求和(附实例)
  • GEE学习笔记 五十六:GEE中如何把文件导出到Google Drive的子目录