JVM之类的装载

1类的装载过程

总体流程:
加载–>链接(校验–>准备–>解析)–>初始化
1)加载:(通过类加载器加载字节码文件生成该类的Class对象)
(1)通过一个类的全限定名来获取该类的二进制字节流。
(2)将这个字节流的静态存储结构转化为方法区运行时数据结构。
(3)在内存堆中生成一个代表该类的java.lang.Class对象(唯一的),作为该类数据的访问入口。
2)链接:
(1)校验:检查加载的字节码文件的正确性与安全性,验证字节流是否符合Class文件的规范,是否能被当前版本的虚拟机处理。
(2)准备:为类变量分配存储空间并设置final static修饰的变量的初始值。

public static int x = 1;

此时x的值为初始值0,而不是1。
(3)解析:JVM将常量池内的符号引用转换为直接引用。
3)初始化:执行类变量的赋值与静态代码块,当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先触发其父类的初始化。(此时x的值被赋值为1。)

2类的加载方法

上面提到的类的加载,这里大概介绍下使用类加载的方法:
1)隐式加载:通过new的方式创建对象。
2)显式加载:运用反射的原理,通过ClassLoader.loadClass或Class.forName的方式。
一个类只会有一个Class对象,而new、forName.newInstance可能有多个对象。在运行期间我们要实例化任何一个类时,JVM会尝试看内存中是否有这个类,如果有则直接创建类的实例,如果没有则根据类名去加载这个类(运用双亲委派机制)。当JVM调用类加载器时便会为该类生成一个Class对象,该类的所有实例都有着这个Class对象,而且是唯一的。

3loadClass与forName的区别

通过前两节的介绍,这里引出ClassLoader.loadClass与Class.forName的区别:
1)ClassLoader.loadClass只做一件事:执行类的装载中的类的加载过程,不会执行链接与初始化过程(Spring中的懒加载会用到,不需要初始化等操作,提高加载效率)。
2)Class.forName则会执行全部的类装载过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值