首先必须强调的一点就是字节码文件本质还是一堆0,1组成的文件,只是在jvm解析的时候会将二进制转化为十六进制,再根据内置好的映射去一一对应十六进制对应的含义进行解释执行
文件的头两个字节是coffeebabe魔数,标识这是个class文件
接下来是两个字节的次版本号
接下来是两个字节的主版本号
接下来是常量池模块
首先是两个字节标识常量池的个数
接下来就是常量池表,你可以理解为是一些固定好字段的结构体
比如首先是一个 字节的tag,标识是什么类型的常量,根据这个类型的常量,后面就有固定长度格式的字段。以此类推数完上面标识的常量池个数的常量池表就表示常量池已经到此结束了
接下来是访问修饰符,两个字节,也是标识而已,每个标识会对应几个访问修饰符相加的和
接下来是两个字节的当前全类名,这里是指向常量池中的引用
接下来也是两个字节的父类名,也是指向常量池的引用
接下来是两个字节的接口数,所以一个类最多的接口数是0xFFFF个
接下来是字段模块,跟常量池一样的组织形式
首先是固定好字节长度的字段数,
接下来就是字段表, 标识了该字段的类型,访问修饰符,字段名等
接下来是方法模块,也是跟字段模块 一样的组织形式
首先是固定好字节长度的方法个数
然后是方法个数的方法表,这里也同样包含了方法的访问修饰符,参数及返回值,方法名,最重要的值得一提的是方法表中也有属性表,比如Code属性,会包含方法中的代码转化成的指令集,还有行号,本地变量表等相关信息
接下来就是属性模块,
一样的套路,属性个数后面跟对应个数的属性表,包含 比如SourceFile指向当前类对应的源码路径等
到此为止,算是粗略讲完了字节码文件的概览,至少我们可以很清楚的看到jvm的字节码执行引擎是怎么找到类的相关对应信息的。