基础 -- Java笔记13--虚拟机之类文件
类文件结构
概述:计算机发明的时候它只认识0和1,经过这么多年的高速发展,它仍然只认识0和1,但我们将编写的程序编译成二进制本地机器码已不再是唯一的选择,越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式;Java就是为了跨平台而诞生的,而现在,Java虚拟机更加强调语言无关性,因为平台无关性已经成为语言的共性而不能作为Java存活的保证了,语言无关性值Java虚拟机接受执行非Java语言程序;也许日后虚拟机的语言无关性会超越它在平台无关性上的优势;
class类文件结构–以下为一个简单类的class文件:(Class文件是采用一种类似于c语言结构体的伪结构来存储数据的,这种结构中只有两种数据类型:无符号数和表;无符号数以u1、u2、u4、u8分别表示1、2、4、8个字节的无符号数,无符号数是可以表示数字、引用、数量值或者按照UTF-8编码构成的字符串值的基本数据类型;表是有多个无符号数或者其他表构成的复合数据类型)

魔数:每个class文件的头4个字节称为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的class文件,很多文件的存储标准中都采用魔数来进行身份认证,比如gif或者JPG等在头文件中都存有魔数,使用魔数而不是扩展名来进行识别主要是基于安全方面考虑,显然扩展名容易受到修改;而Java的魔数标识是CAFEBABE(咖啡宝贝,有毒,Java是一种什么咖啡的生产地,这些程序员是多喜欢咖啡);
class文件版本:紧接着魔数的4个字节存储的是Class文件的版本号;第4和第5个字节存储的是副版本号,这个例子中的编号为:00 00 00 34;为16进制数,转换为十进制为50,所谓副版本号的意思是这样的:00 03 00 34,这个编号为:50.3;jdk高版本可处理低版本文件,却不能处理高版本文件;每个版本的jdk具体能处理多少版本号这里就不列举了;
常量池:在主次版本号之后的是常量池入口,常量池是占用Class文件空间最大的数据项目之一;由于常量池中常量的数量的不固定的,所以在常量池人入口需要放置一项u2类型的数据来代表常量池的计数器;案例中的00 16即十进制中的22,代表常量池中有21个常量,从1开始计算,0表示“不引用任何一个常量池项目”常量池中主要存放的两大类常量:字面量和符号引用(类的接口的权限定名、字段的名称和描述符、方法的名称),Java代码在编译的时候不会把字段、方法等信息存储在Class文件中,而是在常量池中保存相应的符号引用,在类创建或是运行时解析、翻译到具体的内存地址中去;
