类加载是JVM中的一个非常核心的流程.
做的事情,就是把.class 文件,转换成JVM中的类对象~
类加载基本流程:
1. 加载
把.class 文件给找到~~
代码中需要加载某个类,就需要在某个特定的目录中找到这个.class 文件~~
找到之后,就需要打开这个文件,并且进行读取文件~
此时就把这些数据已经读到内存里了~~
2. 验证
验证就是把刚才读到内存里的东西,进行一个校验~~
验证一下,刚才读到的这个内容是不是一个合法的.class 文件~得是编译器生成的.class文件才能通过验证.
如果随便创建一个文件,后缀名设为.class这是不能通过验证的~一~
除了验证文件格式之外,也会验证一下文件里面的一些字节码指令对不对~(方法里面具体要执行的指令)
3. 准备
这个准备阶段,其实就是为了类对象中的一些成员分配内存空间.(静态变量....),并且进行一个初步的初始化~~(把初始的空间设为全O)
4. 解析
这个是针对字符串常量进行的处理~~
.class文件中就涉及到一些字符串常量.
把这个类加载的过程中,就需要把这些字符串常量给替换成当前JVM内部已经持有的字符串常量的地址~
不是程序一启动,就立即把所有的类都给加载了.
用到哪个类就加载哪个类.
而字符串常量池是最初启动JVM就有的(堆里)
5. 初始化
这里就会真正的对静态变量进行初始化~~同时也会执行static 代码块~~
例题:重中之重手撸不容易
由父及子,静态先行
类加载中的双亲委派机制
什么是双亲委派模型?
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
启动类加载器:加载 JDK 中 lib 目录中 Java 的核心类库,即$JAVA_HOME/lib目录。 扩展类加载
器。加载 lib/ext 目录下的类。
应用程序类加载器:加载我们写的应用程序。
自定义类加载器:根据自己的需求定制类加载器。