类文件结构
一、概述
二、无关性的基石(一次编写,到处运行):字节码
java虚拟机不和任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件包含了
Java虚拟机指令集和符号表以及若干其他辅助信息。
三、Class类文件的结构
任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来,类或接口并不一定都定义在文件里,
(比如可以通过类加载器直接生成)
Class文件是大端序,高位在前(最高位字节在地址最低位)
X86处理器是小端序
Class文件中只有两种数据类型,无符号数和表
无符号数:u1,u2,u4,u8
表:由多个无符号数或者其他表作为数据项构成的复合数据类型
整个Class文件本质上就是一张表
各数据项具体含义:
1、魔数与Class文件的版本
每个Class文件的头4个字节称为魔数,唯一作用是确定这个文件是否是一个能被虚拟机接收的Class文件(身份识别)
0xCAFEBABE
魔数后面的4个字节存储Class文件的版本号:次版本(5、6字节)+主版本号(7、8字节)
2、常量池
紧接版本号之后是常量池入口
主要存放两大类常量:字面量和符号引用
字面量:文本字符串、final常量值
符号引用:
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
常量池中每一项常量都是一个表,共14种表
javap
3、访问标志
紧跟常量池后面的两个字节:用于标识一些类或接口层次的访问信息(public、abstract、final等)
4、类索引、父类索引、接口索引集合
类索引(this_class):u2
父类索引(super_class):u2
接口索引集合(interfaces):一组u2的数据的集合
5、字段表集合
描述接口或者类中声明的变量
6、方法表集合
类似字段表
在java中,要重载一个方法,要求与原方法有相同的简单名称,此外还要有不同的特征签名。
由于返回值不会包含在特征签名中,因此java中无法依靠返回值的不同来对已有方法重载。
特征签名:一个方法中各个参数在常量池中的字段符号引用的集合
7、属性表集合(重点)
在class文件、字段表、方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息
常用部分:
属性名称 使用位置 含义
Code 方法表 Java代码编译成的字节码指令
ConstantValue 字段表 final关键字定义的常量值
Deprecated 类、方法表、字段表 被声明为deprecated的方法和字段
Exceptions 方法表 方法抛出的异常
EnclosingMethod 类文件 标识类所在的外围方法(针对局部类或匿名类)
。。。
(1)Code属性
这个得好好回头看
(2)Signature
反射、泛型
四、字节码指令简介
大部分指令都没有支持整数类型byte、char和short,甚至没有任何指令支持boolean类型。编译器会在运行期
或编译期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为
相应的int类型
内容很多,记得回头看