一篇文章带你深入理解 Java 中的Class.getClassLoader
文章目录
- 一、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相关推荐
- java中抽象接口_一篇文章让你彻底理解java中抽象类和接口
相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文 ...
- 一篇文章让你彻底理解java中抽象类和接口
相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文 ...
- (面经总结)一篇文章带你完整复习 Java 中并发关键字(CountDownLatch/CyclicBarrier/Semaphore/Volatile)
文章目录 一.倒计数器:CountDownLatch 二.循环栅栏:CyclicBarrier 三.信号量:Semaphore 四.volatile 关键字的作用 一.倒计数器:CountDownLa ...
- 一篇文章带你搞定 Java 中 @Target、@Documented 和 @Inherited 注释
文章目录 一.@Target 二.@Documented 注释 三.@Inherited 注释 一.@Target 如果一个Annotation 没有明确地指明定义的位置,则可以在任意的位置使用,例如 ...
- (面经总结)一篇文章带你完整复习 Java 中的 AQS
文章目录 一.什么是AQS 二.AQS的原理 三.state:状态 四.AQS共享资源的方式:独占式和共享式 一.什么是AQS AQS(Abstract Queued Synchronizer)是一个 ...
- (面经总结)一篇文章带你整理面试过程中关于Java 中多线程的创建方式的最全整理
文章目录 一.Java线程的创建方式 二.继承Thread类 三.实现 Runnable 接口 四.通过ExecutorService和`Callable`实现有返回值的线程 五.基于线程池 六.面试 ...
- 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...
- 一篇文章带你认识数学建模中的二维插值
本篇文章主要是认识数学建模中的二维插值 二维插值的具体计算可参考:一篇文章带你搞定二维插值的 MATLAB 计算 文章目录 一.引言 二.网格节点的概念 三.散乱节点的概念 四.二维插值的常见方法 1 ...
- 一篇文章带你深入理解漏洞之 XXE 漏洞
目录 一.XXE 是什么 二.简单介绍一下背景知识: 三.基础知识 重点来了: 四.我们能做什么 实验一:有回显读本地敏感文件(Normal XXE) 新的问题出现 新的解决方法 实验二:无回显读取本 ...
- 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...
今天带大家快速理解盒子模型,直接上代码: css盒子 我的css盒子测试模型 上面代码没有任何难度,只是写了一个div标签,大家已经知道,div标签是块级元素,所以会占满一行: 但是我们也注意到了图片 ...
最新文章
- antd+dva笔记
- Windows搭建wnmp
- 计算机的硬件发展趋势为,高性能计算机的发展趋势
- c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配
- 安装vs2008出现的问题
- linq to sql查询中返回linq自动建立的实体类型)
- 在Sping Boot logback的使用
- 1.2.1 计算机网络的分层结构、协议、服务和接口(转载)
- JAVA语言基础-面向对象(IO:IO字节流)
- Steve Pavlina:如何ASAP找到人生目标?
- Springboot
- 推荐一款免费,不限流量的内网穿透软件
- VMware虚拟机安装win10卡顿优化
- 2019西安交大计算机专业研究生分数线,西安交通大学公布2019年硕士研究生招生复试基本分数线...
- Window平台Git-Bash的主题配置
- 阿里云短信服务 手机验证码
- mac 不显示 外接屏幕_Mac连接投影仪 Mac外接显示器设置教程
- 构建城市三维信息模型(CIM)与数字孪生城市可视化技术 优锘ThingJS
- istqb纸质证书_关于istqb证书有效期的阿里云论坛用户知识和技术交流
- 我们的flowable改造(8)-----BPMN模型