Java编译过程是将Java文件转换为Claaa文件,从而实现了跨平台的功能, 本文详细讲述Class文件结构。
一、 概述
计算机只能识别0和1,所以大家编写的程序都需要经过编译器,转换为由0和1组成的二进制本地机器码(Native Code)。随着虚拟机的不断发展,很多程序语言开始选择与操作系统和机器指令集无关的格式作为编译后的存储格式(Class文件),从而实现”Write Once, Run Anywhere”。 Java设计之初,考虑后期能让Java虚拟机运行其他语言,目前有越来越多的其他语言都可以直接需要在Java虚拟机,虚拟机只能识别Class文件,至于是由何种语言编译而来的,虚拟机并不关心,如下图:
Java语法中定义各种变量、关键字、运算符的语义最终由多个字节码命令组合而成。因此字节码命令所能提供的语义描述能力必然要比Java语言本身更加强大。
二、Class组成
Class文件是一组以8位字节为单位的二进制流,中间没有任何分隔符,非常紧凑。 当需要占用8位以上的数据时,会按照Big-endian顺序,高位在前,低位在后的方式来分割成多个8位字节来存储。
- 任何一个Class文件都对应着唯一的类或接口的定义信息;
- 类或接口并不一定定义在文件里,也可以通过类加载器直接生成。
Java虚拟机规范规定:Class文件格式采用伪结构来存储数据,伪结构中只有无符号数和表这两种数据类型。
- 无符号数:是基本数据类型,以u1、u2、u4、u8分别代表1个字节、2个字节、4个字节、8个字节的无符号数。无符号数用于描述数字、索引引用、数量值、字符串值。
- 表:是由多个无符号数或者子表作为数据项构成的符合数据类型。用于描述有层次关系的复合结构的数据。整个Class其实就是一张表。