Class 文件结构
一.语言无关性
1.java虚拟机提供了java语言跨平台功能。可以让同一份Class文件运行在不同的平台上
2.java虚拟机不仅提供了跨平台功能,甚至还还提供了跨语言的特性,只要各种语言的源码
编译成 Class 文件,理论上都可以在 java 虚拟机上运行
二.Class 文件
1.Class文件的结构(包含 类的属性,类的方法<访问标记,名称,描述符,属性>,
类的字段<访问标记表项,名称,描述符,属性>,实现接口,父类,魔数<Class文件的特征>
小版本号,大版本号,常量池<各种常量,整数,字符串,Class>,访问标记<public,static>
当前类)
2.Class 文件结构体的定义:
a.文件以一个4字节Magic(魔数)开头,紧跟着两个大小版本号
b.在版本号之后是常量池,常量池的个数为conctant_pool_count,常量池中的表项有conctant_pool_count-1项
c.常量池之后是类的访问修饰符,代表自身类的引用,父类引用以及接口数量和实现的接口引用
d.在接口之后,有着字段的数量和字段描述,方法数量以及方法的描述
e.最后存放着类文件的属性信息
3.魔数:Class 文件的标记,是一个4个字节的无符号整数,固定为 OxCAFEBABE
4.Class 文件的版本:当前的 Class 文件,是由哪个版本的编译器编译产生的。高版本的虚拟机向下兼容
低版本编译的Calss文件,低版本的虚拟机不向上兼容高版本编译的Class 文件。所以在开发环境跟实际生产
环境中,应该注意JDK 的版本是否一致
5.常量池:Class文件中内容最丰富的区域之一 ,存放着所有的常数,是整个Class 文件的基石。
常量池底层数据类型:COUNTANT_Utf8 , CONSTANT_Intrger ,CONSTANT_Float , CONSTANT_Long ,
CONSTANT_Double 分别表示 UTF8字符串,整数 , 浮点数,长整数和双精度浮点常量
CONSTANT_NameAndType 表示一个名词和类型
CONSTANT_Methoderf 表示一个类的方法
CONSTANT_Fieldref 表示一个类字段的引用
CONSTANT_InterfaceMethoderf 表示一个接口的方法
CONSTANT_MethodHandle 表示函数的方法,类的字段或者构造函数
CONSTANT_MethoderType 描述一个方法签名
CONSTANT_InvokeDynamic 描述一个动态调用,动态调用的是java 虚拟机平台引入的专门为动态语言
提供函数动态调用绑定支持的功能
6.Class的访问标记 :两个字节表示,用于表明该类的访问信息
7.当前类,父类的接口 :指定该类的类别,父类类别以及实现的接口
8.Class 文件字段 :类的字段信息
9.Class文件的方法基本结构:类的方法信息
10.方法的执行主体-Code 属性:
11.记录行号 - LineNumberTble 属性
12.保存局部变量和参数 - LacalVariableTable 属性
13.加快字节码校验 - StackMaoTble 属性
14.抛出异常 - Exception 属性
15.SourceFile 属性 : 描述当前 Class 文件是由哪个源代码文件编译而来
16.BootstraoMethods 属性:描述和保存引导方法
17.InnerClasses 属性 : 描述外部类和内部类之间的联系
三.ASM : 一款操作 java 字节码的操作库,直接工作于底层。使用复杂,要求开发人员熟悉和掌握Class 文件的基本格式
和java字节码对开发人的的要求相对较高,因此很少被直接使用。