加载机制的原理: 加载过程: 1 加载:class文件实质上是的字节数组,来源有很多(文件、网络、服务器、jar包等等。。。)class文件经类加载器加载后,会将这些静态数据转换成方法区中的运行时二进制数据,同时在堆中生成一个代表这个类的java.lang.Class对象(反射对象),作为方法区中类数据的访问入口。 2 连接:
- 验证:确保加载的类信息复合JVM的规范,没有安全方面的问题。
- 准备:为类变量(静态变量)分配内存设置默认值,这些内存都将在方法区中进行分配
- 解析:符号引用转化为直接引用(类加载完成之后,每个类都有一个常量池,常量池里存储了符号引用,解析的过程即是把这些符号指向具体的地址值)(在调用类中用final修饰的常量时,并不会执行类的初始化,直接从常量池里获取值,常量在编译阶段就存入到常量池中了)
3 初始化
- 初始化阶段是执行类构造器<clinit>()方法的过程,类构造器<clinit>()方法是由编译器自动收集类的静态变量赋值动作和静态语句块中的语句合并产生的;
- 当初始化一个类时,若其父类还未初始化,则先初始化其父类
- 虚拟机会保证一个类的<clinit>()方法在多线程环境只中被正确加载和同步
- 当访问一个Java类的静态域时,只有 真正声明这个域的类才会被初始化。
|