文章目录

  • 一、ClassLoader 的作用
  • 二、ClassLoader 层次结构
  • 三、Class 加载时调用类加载器的顺序

一、ClassLoader 的作用

我们都知道java程序写好以后是以.java(文本文件)的文件存在磁盘上,然后,我们通过(bin/javac.exe)编译命令把.java文件编译成.class文件(字节码文件),并存在磁盘上。
但是程序要运行,首先一定要把.class文件加载到JVM内存中才能使用的,我们所讲的classLoader,就是负责把磁盘上的.class文件加载到JVM内存中,如下图所示:

你可以认为每一个Class对象拥有磁盘上的那个.class字节码内容,每一个class对象都有一个getClassLoader()方法,得到是谁把我从.class文件加载到内存中变成Class对象的

二、ClassLoader 层次结构


(1)根类加载器(null)
它是由本地代码(c/c++)实现的,你根本拿不到他的引用,但是他实际存在,并且加载一些重要的类,它加载(%JAVA_HOME%\jre\lib),如rt.jar(runtime)、i18n.jar等,这些是Java的核心类。
(2)平台类加载器(PlatformClassLoader)(jdk1.8之后的版本,之前的称为扩展类加载器 ExtClassLoader)
虽说能拿到,但是我们在实践中很少用到它,它主要加载扩展目录下的jar包, %JAVA_HOME%\lib\ext
(3)应用类加载器(appClassLoader)
它主要加载我们应用程序中的类,如Test,或者用到的第三方包,如jdbc驱动包等。这里的父类加载器与类中继承概念要区分,它们在class定义上是没有父子关系的。

三、Class 加载时调用类加载器的顺序

当一个类要被加载时,有一个启动类加载器和实际类加载器的概念,这个概念请看如下分析:

如上面的Test.class要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载它,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。

所以这个时候根类加载器就去加载这个类,可在%JAVA_HOME%\jre\lib下,它找不到dir_b.Test这个类,所以他告诉他的子类加载器,我找不到,你去加载吧,子类扩展类加载器去%JAVA_HOME%\lib\ext去找,也找不着,它告诉它的子类加载器 AppClassLoader,我找不到这个类,你去加载吧,结果AppClassLoader找到了,就加到内存中,并生成Class对象。
这个时间时候启动类加载器(应用类加载器)和实际类加载器(应用类加载器)是同一个.

这也是 Java 中著名的委托加载机制:

一篇文章带你深入理解 Java 中的Class.getClassLoader相关推荐

  1. java中抽象接口_一篇文章让你彻底理解java中抽象类和接口

    相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文 ...

  2. 一篇文章让你彻底理解java中抽象类和接口

    相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文 ...

  3. (面经总结)一篇文章带你完整复习 Java 中并发关键字(CountDownLatch/CyclicBarrier/Semaphore/Volatile)

    文章目录 一.倒计数器:CountDownLatch 二.循环栅栏:CyclicBarrier 三.信号量:Semaphore 四.volatile 关键字的作用 一.倒计数器:CountDownLa ...

  4. 一篇文章带你搞定 Java 中 @Target、@Documented 和 @Inherited 注释

    文章目录 一.@Target 二.@Documented 注释 三.@Inherited 注释 一.@Target 如果一个Annotation 没有明确地指明定义的位置,则可以在任意的位置使用,例如 ...

  5. (面经总结)一篇文章带你完整复习 Java 中的 AQS

    文章目录 一.什么是AQS 二.AQS的原理 三.state:状态 四.AQS共享资源的方式:独占式和共享式 一.什么是AQS AQS(Abstract Queued Synchronizer)是一个 ...

  6. (面经总结)一篇文章带你整理面试过程中关于Java 中多线程的创建方式的最全整理

    文章目录 一.Java线程的创建方式 二.继承Thread类 三.实现 Runnable 接口 四.通过ExecutorService和`Callable`实现有返回值的线程 五.基于线程池 六.面试 ...

  7. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  8. 一篇文章带你认识数学建模中的二维插值

    本篇文章主要是认识数学建模中的二维插值 二维插值的具体计算可参考:一篇文章带你搞定二维插值的 MATLAB 计算 文章目录 一.引言 二.网格节点的概念 三.散乱节点的概念 四.二维插值的常见方法 1 ...

  9. 一篇文章带你深入理解漏洞之 XXE 漏洞

    目录 一.XXE 是什么 二.简单介绍一下背景知识: 三.基础知识 重点来了: 四.我们能做什么 实验一:有回显读本地敏感文件(Normal XXE) 新的问题出现 新的解决方法 实验二:无回显读取本 ...

  10. 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...

    今天带大家快速理解盒子模型,直接上代码: css盒子 我的css盒子测试模型 上面代码没有任何难度,只是写了一个div标签,大家已经知道,div标签是块级元素,所以会占满一行: 但是我们也注意到了图片 ...

最新文章

  1. antd+dva笔记
  2. Windows搭建wnmp
  3. 计算机的硬件发展趋势为,高性能计算机的发展趋势
  4. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配
  5. 安装vs2008出现的问题
  6. linq to sql查询中返回linq自动建立的实体类型)
  7. 在Sping Boot logback的使用
  8. 1.2.1 计算机网络的分层结构、协议、服务和接口(转载)
  9. JAVA语言基础-面向对象(IO:IO字节流)
  10. Steve Pavlina:如何ASAP找到人生目标?
  11. Springboot
  12. 推荐一款免费,不限流量的内网穿透软件
  13. VMware虚拟机安装win10卡顿优化
  14. 2019西安交大计算机专业研究生分数线,西安交通大学公布2019年硕士研究生招生复试基本分数线...
  15. Window平台Git-Bash的主题配置
  16. 阿里云短信服务 手机验证码
  17. mac 不显示 外接屏幕_Mac连接投影仪 Mac外接显示器设置教程
  18. 构建城市三维信息模型(CIM)与数字孪生城市可视化技术 优锘ThingJS
  19. istqb纸质证书_关于istqb证书有效期的阿里云论坛用户知识和技术交流
  20. 我们的flowable改造(8)-----BPMN模型

热门文章

  1. 国内第一本许可式订阅E-mail营销书籍
  2. 机器人视觉系统分为哪几种,主要包括哪些关键技术?
  3. 【实战记录分析】目录导航
  4. 猴子排序算法_猴子排序-有史以来最慢的排序算法?
  5. 第三方支付平台——业务介绍(龙果)
  6. 汉字 计算机 坟墓,让汉字跨越数字化鸿沟
  7. H3C交换机远程端口镜像配置
  8. c语言 continue什么意思,continue在C语言中什么意思?
  9. 利用数据泵导入导出dmp
  10. 不用编写程序代码,送你一个爬虫程序批量采集猫眼电影票房数据