代码(code):*.java 文件

字节码(byte-code):*.class文件,在Java中由代码(*.java) 文件经过javac编译器编译后生成的产物,在JVM(java虚拟机)识别并执行,与硬件平台无关,内容为01

【其他语言也可以由各自编译器编译生产.class文件,并在JVM上运行】

机器码:计算机直接使用的程序语言,其语句就是机器指令码,机器指令码是用于指挥计算机应做的操作和操作数地址的一组二进制数。【百度百科】

1)Little-endian:将低序字节存储在起始地址(低位编址)

2)Big-endian:将高序字节存储在起始地址(高位编址)

class文件结构

class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据:无符号数 和 表。解析就以这两种数据类型为基础。

无符号数属于基本的数据类型,以u1、u2、u3、u4来分别表示1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8 编码构成的字符串值。

表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info” 结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表~

ClassFile {
u4 magic;  // 魔法数字,表明当前文件是.class文件,固定0xCAFEBABE
u2 minor_version; // Class文件的副版本和主版本
u2 major_version; // Class文件的主版本
u2 constant_pool_count; // 常量池计数
cp_info constant_pool[constant_pool_count-1];  // 常量池内容
u2 access_flags; // 类访问标识
u2 this_class; // 当前类
u2 super_class; // 父类
u2 interfaces_count; // 实现的接口数
u2 interfaces[interfaces_count]; // 实现接口信息
u2 fields_count; // 字段数量
field_info fields[fields_count]; // 包含的字段信息
u2 methods_count; // 方法数量
method_info methods[methods_count]; // 包含的方法信息
u2 attributes_count;  // 属性数量
attribute_info attributes[attributes_count]; // 各种属性
}

常量池中主要存放两大常量:字面量和符号引用

字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为 final 的常量值等。

符号引用包括下面三类常量:

1、类和接口的全限定名

2、字段的名称和描述符

3、方法的名称和描述符

常量池中的每一项常量都是一个表~

具体内容只看了大概,就不讨论了