Class文件总结

类文件结构

虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,都可以载入和执行同一种平台无关的字节码,从而实现“一次编写,到处运行”。
除JAVA外也有一大批在java虚拟机智商运行的语言:Clojure,Groovy,JRuby等
虚拟机不关心Class来源于什么语言,只要复合Class文件应有的结构就能在java虚拟机中运行


Class文件是一组以8位字节为基础单位的二进制流,当遇到需要占用8位字节以上空间的数据项是,会按高位在前的方式分割成若干个8位字节存储
Class文件采用伪结构来存储:包含两种数据类型:无符号数和表
无符号数属于基本数据类型:u1,u2,u3,u4分别代表1字节,2字节,4字节,8字节的无符号数:数字,索引引用,数量值或utf-8编码的字符串
表示由多个无符号数或其他表组成的复合数据类型,_info结尾


1.每个Class文件的头4个字称为魔数:确定这个文件是否为一个能被虚拟机接受的Class文件。紧接着的是Class文件的版本号(次,主各2字节)
2.常量池:紧接着主次版本号之后。是Class文件中第一个出现的表类型数据项目,常量池入口处放一项u2类型的数据,表示常量池容量计数。
存储2大类常亮:字面量:文本字符串,被声明为final的常量
  符号引用:类和接口的全限定名
字段的名称和描述符:描述符用来描述字段的数据类型,方法参数列表和返回值
方法的名称和描述符
虚拟机运行时,需从常量池获得对应字段,方法的符号引用,再在类创建时或运行时解析并翻译到具体的内存地址之中
常量池的每一项常量都是一个表,共11种结构

Class中方法,字段都需引用CONSTANT_Utf8_info型常量来描述名称,最大长度是u2,2字节,16位,所以方法名最长为(2^16)-1


3.访问标志:紧接着常量池的2个字节表示:识别类或接口的访问信息:是类还是接口,是否Public 是否abstract,类是否final等


4.类索引(u2),父类索引(u2),接口索引集合(一组u2)


5.字段表集合:描述接口或类中声明的变量(类级和实例级,不包括方法内部的局部变量):作用域,static,final,volatile等


6.方法表集合:描述方法:访问标志,名称索引,描述符索引。(方法中代码存放在方法属性表中的Code属性里)
自动添加类构造器<clinit>方法和实例构造器<init>方法

7.属性表集合:
Code属性:方法体内的代码经过javac编译,变为字节码指令存储在Code属性
在任何实例方法中都可通过“this”关键字访问到对象,因此在实例方法的局部变量表中至少存在一个局部变量:指向当前实例

Exception属性

LineNumberTable属性:描述java远吗行号和字节码行号的对应关系

LocalVariableTable属性:描述栈帧中局部变量表中的变量与java源码中定义的变量之间的关系

SourceFile属性

ConstantValue属性:通知虚拟机自动为静态变量(static修饰)赋值:如果有final static修饰:基本类型或String类型:
非static类型变量的赋值实在实例构造器<init>方法中进行
类变量:没有final修饰或不是基本类型及String 在<clinit>方法中初始化

猜你喜欢

转载自blog.csdn.net/zhuyong7/article/details/80466221