原著为《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》,知识点仅作为日后复习专用!
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。
(这个Class是指编译后的Class)
一:概述
由于最近十年内虚拟机以及大量建立在虚拟机之上的程序语言的快速发展,将我们编写的程序编译成二进制本地机器码(native code)已不在是唯一选择,越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为编译后的储存格式。
二:(平台、语言)无关性知识
sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的“一次编写,到处运行。”
各种不同平台的虚拟机与所有平台都统一使用的程序存储格式----字节码(Byte Code)是构成平台无关的基石。(实现语言无关性的基础也是虚拟机和字节码的存储格式)
Java虚拟机不和包括Java在内的任何语言绑定,它只于"Class文件"这种特定的二进制文件格式所关联,CLass文件包含了Java虚拟机指令集和符号表以及若干其他辅助信息
Java语言中的各种变量、关键字和运算符号的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更加强大。因此,有一些Java语言本身无法有效支持的语言特性不代表字节码本身无法有效支撑,这也为其他语言实现一些有别于Java的语言特性提供了基础。
三:Class类文件的结构
注意:任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件中里(譬如类或接口也可以通过类加载器直接生成。)
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全是程序运行的必要数据,没有空隙存在。
四:魔数与Class文件的版本
每个Class文件的头四个字节称为魔数,它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件。
五:常量池
常量池可以理解为Class文件之中的资料仓库,它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现的表现型数据项目。
作者:扯闲话
链接:https://www.jianshu.com/p/746f09cf8c2f