Java字节码
参考 周志明 《深入理解Java虚拟机》
什么是Class文件(字节码文件)
Class文件是Java源文件编译后生成的文件,是一组以8个字节为基础单位的二进制流,可以被任何系统上的Java虚拟机执行,Java 虚拟机通过类加载器来加载Class文件。
同一个Class文件在不同的虚拟机会得到不同的机器指令(Windows和Linux的机器指令不同),但执行结果相同,因此保证Java语言的跨平台性。
Java字节码的整体结构
-
魔数:Class的头四个字节,确定这个文件是否是一个能被虚拟机接受的文件,类似识别身份的作用
-
次版本号、主版本号:第5、6字节标识次版本,第7、8字节标识主版本
-
常量池:常量池中每一项常量都是一个表,通过每一个常量的表结构起始的标志位来表示当前常量属于哪种常量类型。可以理解为 Class 文件的资源仓库
-
访问标志:标识当前类或接口的访问信息,
public
,final
,abstract
等 -
类索引、父类索引和接口索引(可选)集合: 确定当前类的全限定名,和当前类的父类的全限定名
-
字段表集合:描述接口或类中声明的变量,其中能确定每个字段的数据类型、方法的参数列表以及返回值
-
方法表集合:描述这个类的方法信息
-
属性表集合:Class文件、字段表、方法表都可以携带自己的属性表集合,用来描述专有信息
总结
Java字节码的知识点很杂很枯燥,这里只列举Java字节码整体结构个模块是主要作用,建议看书。
-
Java字节码不是给人看的
,是给JVM虚拟机看的,虚拟机通过规范来解析Class文件中的十六进制数, 来获得Class文件所表示的信息 -
另外即使一个源文件中有很多类,编译器也会将每个类编译成一个Class文件
-
Class文件只是用来表示信息,不会进行程序的优化。