1.1 虚拟机加载Class文件过程:
在JVM 类加载机制的博客里面我介绍过整体流程,这里仅仅介绍加载时相关部分。
在我们启动一个类,或者其他方式加载一个类的时候,会通过类的全限定名获取该类的二进制流,然
后将字节流所代表的的静态存储结构转化成方法区的运行时数据结构,然后会生成一个代表该类的
java.lang.Class 对象,作为在方法区这个类的访问入口。也就是说只要完成了这一步骤,那么通过这个入
口我们就可以访问里面的存储好的数据结构信息了。而且动态加载的时候,会先进行查找,该类是否存在,
存在了就不会再加载了,保持一份。
class 文件是一组以8位字节为基础单位的二进制流,各个数据项目按严格的顺序紧凑的排列在Class文
件中,里面的信息主要描述以下信息:
1.版本号:主版本号和次版本号
2.常量池:主要存放字面量(Literal)和符号引用(references)
2.1 字面量:文本字符串、final 类型的常量值 等
2.2 符号引用:
a.类和接口的全限定名字
b.字段描述和描述符
c.方法的名称和描述
3.访问标志:
a.是类还是接口
b.是否是public 等类型
c.是否是abstract ,是否被声明为final 等标志
4.类索引、父类索引和接口索引集合
a.类索引:确定这个类的全限定名
b.父类索引:确定父类的全限定名
c.接口索引集合:作为入口,作为一个计数器
5.字段表集合:
包括信息有字段作用域(public,private等修饰符)、是实例变量还是类变量(static)、可变性 (final)、并发可见性(volatile)、可否被序列化(transient)等信息
6.方法集合:
包括访问标志、名称索引、描述符索引、属性表集合。
7.其他:包括属性表集合、Code 属性(指令) 等其他这里暂时不过多介绍,详细请看虚拟机的书籍。
|
|