Java 类加载机制

  • 1、类加载过程详解
    • 1.1、类加载过程详解图
    • 1.2、类生命周期
    • 1.3、类生命周期各阶段详解说明
  • 2、类加载器
  • 3、双亲委派模型

1、类加载过程详解

1.1、类加载过程详解图

1.2、类生命周期

  • 一个类从被加载到虚拟机内存中开始,到卸载出内存为止,他的生命周期将会经历以下七个阶段。
#mermaid-svg-6ahAQrTAPUpDCD6D .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .label text{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .node rect,#mermaid-svg-6ahAQrTAPUpDCD6D .node circle,#mermaid-svg-6ahAQrTAPUpDCD6D .node ellipse,#mermaid-svg-6ahAQrTAPUpDCD6D .node polygon,#mermaid-svg-6ahAQrTAPUpDCD6D .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-6ahAQrTAPUpDCD6D .node .label{text-align:center;fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .node.clickable{cursor:pointer}#mermaid-svg-6ahAQrTAPUpDCD6D .arrowheadPath{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-6ahAQrTAPUpDCD6D .flowchart-link{stroke:#333;fill:none}#mermaid-svg-6ahAQrTAPUpDCD6D .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-6ahAQrTAPUpDCD6D .edgeLabel rect{opacity:0.9}#mermaid-svg-6ahAQrTAPUpDCD6D .edgeLabel span{color:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-6ahAQrTAPUpDCD6D .cluster text{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-6ahAQrTAPUpDCD6D .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-6ahAQrTAPUpDCD6D text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-6ahAQrTAPUpDCD6D .actor-line{stroke:grey}#mermaid-svg-6ahAQrTAPUpDCD6D .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-6ahAQrTAPUpDCD6D #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .sequenceNumber{fill:#fff}#mermaid-svg-6ahAQrTAPUpDCD6D #sequencenumber{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D #crosshead path{fill:#333;stroke:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .messageText{fill:#333;stroke:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-6ahAQrTAPUpDCD6D .labelText,#mermaid-svg-6ahAQrTAPUpDCD6D .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-6ahAQrTAPUpDCD6D .loopText,#mermaid-svg-6ahAQrTAPUpDCD6D .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-6ahAQrTAPUpDCD6D .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-6ahAQrTAPUpDCD6D .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-6ahAQrTAPUpDCD6D .noteText,#mermaid-svg-6ahAQrTAPUpDCD6D .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-6ahAQrTAPUpDCD6D .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-6ahAQrTAPUpDCD6D .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-6ahAQrTAPUpDCD6D .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-6ahAQrTAPUpDCD6D .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .section{stroke:none;opacity:0.2}#mermaid-svg-6ahAQrTAPUpDCD6D .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-6ahAQrTAPUpDCD6D .section2{fill:#fff400}#mermaid-svg-6ahAQrTAPUpDCD6D .section1,#mermaid-svg-6ahAQrTAPUpDCD6D .section3{fill:#fff;opacity:0.2}#mermaid-svg-6ahAQrTAPUpDCD6D .sectionTitle0{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .sectionTitle1{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .sectionTitle2{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .sectionTitle3{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-6ahAQrTAPUpDCD6D .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .grid path{stroke-width:0}#mermaid-svg-6ahAQrTAPUpDCD6D .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-6ahAQrTAPUpDCD6D .task{stroke-width:2}#mermaid-svg-6ahAQrTAPUpDCD6D .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .taskText:not([font-size]){font-size:11px}#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-6ahAQrTAPUpDCD6D .task.clickable{cursor:pointer}#mermaid-svg-6ahAQrTAPUpDCD6D .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-6ahAQrTAPUpDCD6D .taskText0,#mermaid-svg-6ahAQrTAPUpDCD6D .taskText1,#mermaid-svg-6ahAQrTAPUpDCD6D .taskText2,#mermaid-svg-6ahAQrTAPUpDCD6D .taskText3{fill:#fff}#mermaid-svg-6ahAQrTAPUpDCD6D .task0,#mermaid-svg-6ahAQrTAPUpDCD6D .task1,#mermaid-svg-6ahAQrTAPUpDCD6D .task2,#mermaid-svg-6ahAQrTAPUpDCD6D .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutside0,#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutside2{fill:#000}#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutside1,#mermaid-svg-6ahAQrTAPUpDCD6D .taskTextOutside3{fill:#000}#mermaid-svg-6ahAQrTAPUpDCD6D .active0,#mermaid-svg-6ahAQrTAPUpDCD6D .active1,#mermaid-svg-6ahAQrTAPUpDCD6D .active2,#mermaid-svg-6ahAQrTAPUpDCD6D .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-6ahAQrTAPUpDCD6D .activeText0,#mermaid-svg-6ahAQrTAPUpDCD6D .activeText1,#mermaid-svg-6ahAQrTAPUpDCD6D .activeText2,#mermaid-svg-6ahAQrTAPUpDCD6D .activeText3{fill:#000 !important}#mermaid-svg-6ahAQrTAPUpDCD6D .done0,#mermaid-svg-6ahAQrTAPUpDCD6D .done1,#mermaid-svg-6ahAQrTAPUpDCD6D .done2,#mermaid-svg-6ahAQrTAPUpDCD6D .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-6ahAQrTAPUpDCD6D .doneText0,#mermaid-svg-6ahAQrTAPUpDCD6D .doneText1,#mermaid-svg-6ahAQrTAPUpDCD6D .doneText2,#mermaid-svg-6ahAQrTAPUpDCD6D .doneText3{fill:#000 !important}#mermaid-svg-6ahAQrTAPUpDCD6D .crit0,#mermaid-svg-6ahAQrTAPUpDCD6D .crit1,#mermaid-svg-6ahAQrTAPUpDCD6D .crit2,#mermaid-svg-6ahAQrTAPUpDCD6D .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-6ahAQrTAPUpDCD6D .activeCrit0,#mermaid-svg-6ahAQrTAPUpDCD6D .activeCrit1,#mermaid-svg-6ahAQrTAPUpDCD6D .activeCrit2,#mermaid-svg-6ahAQrTAPUpDCD6D .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-6ahAQrTAPUpDCD6D .doneCrit0,#mermaid-svg-6ahAQrTAPUpDCD6D .doneCrit1,#mermaid-svg-6ahAQrTAPUpDCD6D .doneCrit2,#mermaid-svg-6ahAQrTAPUpDCD6D .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-6ahAQrTAPUpDCD6D .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-6ahAQrTAPUpDCD6D .milestoneText{font-style:italic}#mermaid-svg-6ahAQrTAPUpDCD6D .doneCritText0,#mermaid-svg-6ahAQrTAPUpDCD6D .doneCritText1,#mermaid-svg-6ahAQrTAPUpDCD6D .doneCritText2,#mermaid-svg-6ahAQrTAPUpDCD6D .doneCritText3{fill:#000 !important}#mermaid-svg-6ahAQrTAPUpDCD6D .activeCritText0,#mermaid-svg-6ahAQrTAPUpDCD6D .activeCritText1,#mermaid-svg-6ahAQrTAPUpDCD6D .activeCritText2,#mermaid-svg-6ahAQrTAPUpDCD6D .activeCritText3{fill:#000 !important}#mermaid-svg-6ahAQrTAPUpDCD6D .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-6ahAQrTAPUpDCD6D g.classGroup text .title{font-weight:bolder}#mermaid-svg-6ahAQrTAPUpDCD6D g.clickable{cursor:pointer}#mermaid-svg-6ahAQrTAPUpDCD6D g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-6ahAQrTAPUpDCD6D g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-6ahAQrTAPUpDCD6D .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-6ahAQrTAPUpDCD6D .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-6ahAQrTAPUpDCD6D .dashed-line{stroke-dasharray:3}#mermaid-svg-6ahAQrTAPUpDCD6D #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D .commit-id,#mermaid-svg-6ahAQrTAPUpDCD6D .commit-msg,#mermaid-svg-6ahAQrTAPUpDCD6D .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-6ahAQrTAPUpDCD6D g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-6ahAQrTAPUpDCD6D g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-6ahAQrTAPUpDCD6D g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-6ahAQrTAPUpDCD6D .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-6ahAQrTAPUpDCD6D .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-6ahAQrTAPUpDCD6D .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-6ahAQrTAPUpDCD6D .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-6ahAQrTAPUpDCD6D .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-6ahAQrTAPUpDCD6D .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-6ahAQrTAPUpDCD6D .edgeLabel text{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-6ahAQrTAPUpDCD6D .node circle.state-start{fill:black;stroke:black}#mermaid-svg-6ahAQrTAPUpDCD6D .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-6ahAQrTAPUpDCD6D #statediagram-barbEnd{fill:#9370db}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-state .divider{stroke:#9370db}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-6ahAQrTAPUpDCD6D .note-edge{stroke-dasharray:5}#mermaid-svg-6ahAQrTAPUpDCD6D .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-6ahAQrTAPUpDCD6D .error-icon{fill:#522}#mermaid-svg-6ahAQrTAPUpDCD6D .error-text{fill:#522;stroke:#522}#mermaid-svg-6ahAQrTAPUpDCD6D .edge-thickness-normal{stroke-width:2px}#mermaid-svg-6ahAQrTAPUpDCD6D .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-6ahAQrTAPUpDCD6D .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-6ahAQrTAPUpDCD6D .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-6ahAQrTAPUpDCD6D .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-6ahAQrTAPUpDCD6D .marker{fill:#333}#mermaid-svg-6ahAQrTAPUpDCD6D .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-6ahAQrTAPUpDCD6D {color: rgba(0, 0, 0, 0.75);font: ;}

加载
验证
准备
解析
初始化
使用
卸载

需要说明的是:

  • 加载 --> 验证 --> 准备 --> 初始化 --> 卸载 ,这五个阶段的顺序是确定的,类的加载过程必须按该顺序开始执行(只要求按顺序开始,不要求前一个结束了,下一个再开始)。这五个阶段通常是相互交叉地混合进行,会在一个阶段执行的过程中调用、激活另一个阶段。
  • 解析 阶段在某些情况下可以在初始化阶段之后开始。

1.3、类生命周期各阶段详解说明

加载:

​|_ 通过一个类的全限定名,在硬盘中查找并通过IO 加载类的二进制数据(class文件)

​|_ 转为方法区数据结构,并存放到方法区。方法区:类的类信息。

​|_ 在 Java 堆中产生 java.lang.Class 对象。堆:Class 文件对应的类实例。

验证: 作用为验证 class 文件是否符合规范。

​|_ 文件格式的验证:

​    ​    ​|_ 是否以 0xCAFEBABE 开头。

​    ​    ​|_ 版本号是否合理。

​|_ 元数据验证:

​    ​    ​|_ 是否有父类

​    ​    ​|_ 是否继承了 final 类(final 类不能被继承,如果继承了就有问题)

​    ​    ​|_ 非抽象类实现了所有抽象方法

​|_ 字节码验证:

​    ​    |_ 运行检查

​    ​    |_ 栈数据类型和操作码操作参数吻合(例如栈空间只有2字节,但其实却需要大于2字节,此时就认为这个字节码是有问题的)

​    ​    |_ 跳转指令指向合理的位置。

|_ 符合引用验证:

​    ​    |_ 常量池中描述类是否存在。

​    ​    |_ 访问的方法或字段是否存在且有足够的权限。

|_ 说明:可使用 -Xverify:none 关闭验证。

准备:

|_ 作用:为类的静态变量进行初始化,并为类的静态变量分配内存空间,并赋予初始值。

​    ​    |_ final static 修饰的变量:直接赋值为用户定义的值,例如:

​    ​            |_ private final static int value = 123,直接赋值 123.

​    ​    |_ private static int value = 123,该阶段的值依然是 0.

解析: 是将符号引用转换为直接引用.

初始化: JVM 对类进行初始化,对静态变量赋予正确值.

|_ 执行<clinit>方法,clinit 方法由编译器自动收集类里面的所有静态变量的赋值动作及静态语句块合并而成,也叫类构造器方法。

​    ​    |_ 初始化的顺序和源文件中的顺序一致。

​    ​    |_ 子类的<clinit>被调用前,会先调用父类的<clinit>方法。

​    ​    |_ JVM 会保证 clinit 方法的线程安全性。

|_ 初始化时,如果实例化一个新对象,会调用<init>方法对实例变量进行初始化,并执行对应的构造方法内的代码。

​    ​    |_ 构造块在构造方法之前执行。

2、类加载器

类加载器只用于实现类的加载动作,对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确定其在 Java 虚拟机中的唯一性。每一个类加载器,都拥有一个独立的类名称空间。

  • 类加载器由高级别到低级别依次为:
BootStrapClassLoader(启动类加载器—C语言写的)
​ |_ (负责加载 JDK/JRE/LIB目录下,或者被-Xbootclasspath参数所指定的路径中存放的,能被识别的类库,到虚拟机的内存中)
ExtClassLoader(扩展类加载器)
​ |_ (负责加载 JDK/JRE/LIB/EXT 目录下,或者被java.ext.dirs系统变量所指定的路径中所有的类库)
AppClassLoader(应用程序类加载器)
​ |_ 负责加载用户类路径 (ClassPath)上所有的类库,开发者可以直接在代码中使用这个类加载器
用户自定义类加载器
​ |_ 流、网络、数据库

3、双亲委派模型

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上。因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

  • 双亲委派模型的实现源码如下:

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {// 首先,检查请求的类是否已经被加载过了 Class c = findLoadedClass(name); if (c == null) { try {if (parent != null) { c = parent.loadClass(name, false);} else { c = findBootstrapClassOrNull(name); }} catch (ClassNotFoundException e) { // 如果父类加载器抛出ClassNotFoundException // 说明父类加载器无法完成加载请求 }if (c == null) { // 在父类加载器无法加载时 // 再调用本身的findClass方法来进行类加载 c = findClass(name);} }if (resolve) { resolveClass(c);}return c;
}    

从源码可以看出先检查请求加载的类型是否已经被加载过,若没有则调用父加载器的 loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。假如父类加载器加载失败, 抛出ClassNotFoundException异常的话,才调用自己的findClass()方法尝试进行加载。

.

Java 类加载机制(二)相关推荐

  1. 深入研究Java类加载机制

    深入研究Java类加载机制   类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载 ...

  2. Java类加载机制深度分析

    为什么80%的码农都做不了架构师?>>>    Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. ...

  3. Java高级篇——深入浅出Java类加载机制

    转载自 Java高级篇--深入浅出Java类加载机制 类加载器 简单讲,类加载器ClassLoader的功能就是负责将class文件加载到jvm内存. 类加载器分类 从虚拟机层面讲分为两大类型的类加载 ...

  4. java 加载类java_深入研究Java类加载机制

    深入研究Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比 ...

  5. 小黑框运行java_初探Java类加载机制

    初探Java类加载机制 一.在jdk1.2以后,类加载是通过委托来完成的,这意味着如果 ClassLoader 不能找到类,它会请求父代 ClassLoader 来执行此项任务,所有 ClassLoa ...

  6. java加载机制_详解Java类加载机制

    一:ClassLoader 从JVM结构图中可以看到,类加载器的作用是将Java类文件加载到Java虚拟机. HotSpot JVM结构,图片来自Java Garbage Collection Bas ...

  7. 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。

    目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...

  8. 两道面试题,带你解析Java类加载机制

    2019独角兽企业重金招聘Python工程师标准>>> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa {static ...

  9. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

最新文章

  1. 电动双联电位器ZW1613
  2. Korn Shell: typeset
  3. RIM发警告 部分黑莓手机存在安全漏洞
  4. [NOIP2002]矩形覆盖
  5. Buy Tickets POJ - 2828 思维+线段树
  6. html生物代码,方舟生存进化生物代码 手游生物指令大全
  7. 操作系统课堂笔记(4)进程管理之多道程序设计和进程
  8. linux系统微信怎么放桌面上,Linux 安装微信/QQ
  9. 核方法 Kernel method
  10. 解决editormd不能显示emoji问题
  11. 细胞分裂(洛谷 P1069)
  12. python实现《扫雷》小游戏
  13. 怎么在线制作软件的logo
  14. pytorch转onnx报错的可能原因traced region did not have observable data dependence
  15. JavaScript执行机制(彻底弄懂宏任务微任务)
  16. 手机市场变天:荣耀鸣枪,重回舞台中央?
  17. 升级ESX SERVER
  18. toad for oracle如何执行sql文件,toad执行sql语句
  19. 服务社-企语系统-F_air21.8的Debian11安装方法,也叫协同管理系统
  20. APP推广—区分推广渠道解决方案

热门文章

  1. 自控原理-线性系统时域分析
  2. RecyclerView——实现短视频布局
  3. c语言没写作业检讨300字,没写作业检讨书300字三篇
  4. [STM32] 串口数据帧处理(第一弹)
  5. python 正则匹配
  6. 慢慢做一个模仿天猫网站-3
  7. Python数据分析美团商家,告诉你上海好吃好喝的地方
  8. 模式识别与机器学习(Python实现):决策树分男女
  9. python批量获取淘宝主图地址
  10. 天才第一步之------Helloword