本文导读:
1、前奏,举个生活中的小栗子
2、为何Java类型加载、连接在程序运行期完成?
3、一个类在什么情况下才会被加载到JVM中?
什么是主动使用、被动使用?代码示例助你透彻理解类初始化的时机。
4、类的加载(Loading)内幕透彻剖析
类加载做的那些事儿、双亲委派模型工作过程、ClassLoader源码解析
5、Tomcat如何打破双亲委派模型的
6、上下文类加载器深入浅出剖析
7、最后总结
1、前奏,举个生活中的小栗子
春节马上要到了,大家是不是都在迫不及待的等着回家团圆了呢?
大春运早已启动,回家的过程其实是个「辛苦活」,有的同学还没有买到票呢,蒙眼狂奔终于抢到了,发现竟然是个站票~,退了,连站票的机会都没了吧?
昨天还听一位同学说:『嘿嘿,去年我提前就买到票了,但是... 但是... 去错火车站了。。。尼玛,当时那是啥心情啊~ 幸运的是后来又刷到票了,不然就真回不去了!』
回家大部分朋友都要乘坐交通工具,不管你乘坐什么样的交通工具出行,对于「交通管理」内部来说,最最重要的任务就是保障大家得出行安全。
那么如何保障大家的出行安全呢?
乘坐地铁、飞机等这些公共交通工具,必不可少的最重要的环节就是『安检』,不是什么东西都可以随便让你带的,都是有明文规定的,比如易燃易爆、酒类等都是有限制的。
交通出行的大体过程,有点类似类文件加载到Java虚拟机(简称 JVM)的过程,程序中运行的各种类文件(比如Java、Kotlin),也是要必须经过『安检』的,才能允许进入到JVM中的,一切都是为了安全。
当然,安检的标准是不同的。
接下来,我们进入正题,一起来看看类文件是如何被加载到JVM当中的。
上图的对比只是为了方便理解 ,抽象出来一层『安全检查』,其实就是『类加载』的过程。
这个过程JVM当中约束了规范和标准,都会经过加载、验证、准备、解析、初始化五个阶段。
这里一定要说一个概念,个人认为对于理解类加载过程挺重要的。
更准确的说法,应该是类型
的加载过程,在Java代码中,类型的加载、连接、初始化都是在程序运行时完成的。
这里的类型,是指你在开发代码时常见的class、interface、enum这些关键字的定义,并不是指具体的class对象。
举个