引言

  • JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
  • 从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器结构主要是如下情况:

只有引导类加载器(Bootstrap ClassLoader)是C/C++语言编写

  • 除了顶层的启动类加载器外,其余的类加载器都应当有自己的“父类”加戟器。
  • 不同类加载器看似是继承(Inheritance)关系,实际上是包含关系。在下层加载器中,包含着上层加载器的引用。


没有继承


共同继承一个父类加载器

引导类加载器

  • 启动类加载器(引导类加载器,Bootstrap ClassLoader)
  • 这个类加载使用C/C++语言实现的,嵌套在JVM内部。
  • 它用来加载Java的核心库(JAVAHOME/jre/lib/rt.jar或sun.boot.class.path路径下的内容)。用于提供JVM自身需要的类。
  • 不继承自java.lang.ClassLoader,没有父加载器。
  • 出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类
  • 加载扩展类和应用程序类加载器,并指定为他们的父类加载器。
  • 启动类加载器使用C++编写的?Yes!
    • C/C++:指针函数&函数指针、C++支持多继承、更加高效
    • Java:由C++演变而来,(C++)–版,单继承

使用-XX:+TraceClassLoading参数得到。


扩展类加载器

  • 扩展类加载器(Extension ClassLoader)
  • Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
  • 继承于ClassLoader类
  • 父类加载器为启动类加载器
  • 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

代码举例

package T1;import java.net.URL;public class ClassLoaderTest {public static void main(String[] args) {System.out.println("**********后动类加载器 **************");//获取BootstrapcLassLoader能够加载的api的路径URL[] urLs = sun.misc.Launcher.getBootstrapClassPath().getURLs();for (URL element : urLs) {System.out.println(element.toExternalForm());}// file:/F:/java/jdk/jre/lib/resources.jar//file:/F:/java/jdk/jre/lib/rt.jar//file:/F:/java/jdk/jre/lib/sunrsasign.jar//file:/F:/java/jdk/jre/lib/jsse.jar//file:/F:/java/jdk/jre/lib/jce.jar//file:/F:/java/jdk/jre/lib/charsets.jar//file:/F:/java/jdk/jre/lib/jfr.jar//file:/F:/java/jdk/jre/classes//从上面的路径中随森选择一个类,来看看他的类加我器是什么:引导类加载ClassLoader classloader = java.security.Provider.class.getClassLoader();System.out.println(classloader); // nullSystem.out.println("***********扩展类加载器*************");String extDirs = System.getProperty("java.ext.dirs");for (String path : extDirs.split(";")) {System.out.println(path);}// F:\java\jdk\jre\lib\ext//C:\Windows\Sun\Java\lib\ext//从上面的路径中随意选择一个类,来看看他的类加载器是什么:扩展类加载器ClassLoader classLoader1 = sun.security.ec.CurveDB.class.getClassLoader();System.out.println(classLoader1);// sun.misc.Launcher$ExtClassLoader@12a3a380}
}

系统类加载器

  • 应用程序类加载器(系统类加载器,AppClassLoader)
  • java语言编写,由sun.misc.Launcher$AppClassLoader实现
  • 继承于ClassLoader类
  • 父类加载器为扩展类加载器
  • 它负责加载环境变量classpath或系统属性java.class.path 指定路径下的类库
  • 应用程序中的类加载器默认是系统类加载器。
  • 它是用户自定义类加载器的默认父加载器
  • 通过ClassLoader的getSystemClassLoader()方法可以获取到该类加载器

用户自定义类加载器

  • 在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的。在必要时,我们还可以自定义类加载器,来定制类的加载方式。
  • 体现Java语言强大生命力和巨大魅力的关键因素之一便是,Java开发者可以自定义类加载器来实现类库的动态加载,加载源可以是本地的JAR包,也可以是网络上的远程资源。
  • 通过类加载器可以实现非常绝妙的插件机制,这方面的实际应用案例举不胜举。例如,著名的OSGI组件框架,再如Eclipse的插件机制。类加载器为应用程序提供了一种动态增加新功能的机制,这种机制无须重新打包发布应用程序就能实现。
  • 同时,自定义加载器能够实现应用隔离,例如Tomcat,Spring等中间件和组件框架都在内部实现了自定义的加载器,并通过自定义加载器隔离不同的组件模块。这种机制比C/C++程序要好太多,想不修改C/C++程序就能为其新增功能,几乎是不可能的,仅仅一个兼容性便能阻挡住所有美好的设想。
  • 自定义类加载器通常需要继承FClassLoader。

测试不同类使用的类加载器

引言

  • 每个Class对象都会包含一个定义它的ClassLoader的一个引用。
  • 获取ClassLoader的途径

说明

  • 站在程序的角度看,引导类加载器与另外两种类加载器(系统类加载器和扩展类加载器)并不是同一个层次意义上的加载器,引导类加载器是使用C++语言编写而成的,而另外两种类加载器则是使用Java语言编写而成的。由于引导类加载器压根儿就不是一个Java类,因此在Java程序中只能打印出空值。
  • 数组类的Class对象,不是由类加载器去创建的,而是在Java运行期JVM根据需要自动创建的。对于数组类的类加载器来说,是通过Class.getClassLoader()返回的,与数组当中元素类型的类加载器是一样的;如果数组当中的元素类型是基本数据类型,数组类是没有类加载器的。

代码举例

package T1;public class ClassLoaderTest2 {public static void main(String[] args) throws ClassNotFoundException {// 关于基本类的  类的加载器ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();System.out.println(classLoader); // null,表示是引导类加载器// 关于自定义类的 类的加载器ClassLoader classLoader2 = Class.forName("T1.ClassLoaderTest2").getClassLoader();System.out.println(classLoader2); // sun.misc.Launcher$AppClassLoader@18b4aac2// ############关于数组的########// 与数组当中元素类型的类加载器是一样的String[] arrStr = new String[10];System.out.println(arrStr.getClass().getClassLoader()); // null,表示是引导类加载器ClassLoaderTest2[] ClassLoaderTest2Arr = new ClassLoaderTest2[10];System.out.println(ClassLoaderTest2Arr.getClass().getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2// 基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载int[] intArr = new int[10];System.out.println(intArr.getClass().getClassLoader()); // null,表示不需要类的加载器}
}

尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类相关推荐

  1. 尚硅谷2020最新版宋红康JVM教程-中篇-第3章类的加载过程(类的生命周期)详解-4-过程三:Initialization(初始化)阶段

    static与final的搭配问题 初始化阶段,简言之,为类的静态变量赋予正确的初始值. 具体描述 类的初始化是类装载的最后一个阶段.如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中.此时,类 ...

  2. 尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)

    目录 类的加载第一步----loading 加载".class"文件的方式: 类的加载第二步----linking![在这里插入图片描述](https://img-blog.csd ...

  3. 尚硅谷2020最新版宋红康JVM教程-16-垃圾回收相关概念

    转载: https://www.bilibili.com/video/BV1PJ411n7xZ 参考: https://gitee.com/moxi159753/LearningNotes/tree/ ...

  4. 尚硅谷2020最新版宋红康JVM教程-10-对象实例化内存布局与访问定位

    转载: https://www.bilibili.com/video/BV1PJ411n7xZ 参考: https://gitee.com/moxi159753/LearningNotes/tree/ ...

  5. 尚硅谷 宋红康 JVM教程_02_字节码与类的加载篇

    本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...

  6. 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇——02

    本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...

  7. 尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇

    前言 一.jvm及java体系结构 1. Java及JVM简介 TIOBE语言热度排行榜 https://www.tiobe.com/tiobe-index/ 世界上没有最好的编程语言,只有最适用于具 ...

  8. 尚硅谷2020最新版周阳SpringCloud(H版alibaba)框架开发教程 学习笔记

    前言:今天看到周阳老师出了新课,十分欣喜,很喜欢周阳老师的讲课风格,内容也充实,我也算是周阳老师忠实粉丝啦. 新出的springcloud第二版很符合我现阶段的学习需求.但美中不足的是,目前只有视频资 ...

  9. 尚硅谷-宋红康-JVM上中下篇完整笔记-JVM中篇

    一.Class文件结构 1.概述 1.1 字节码文件的跨平台性 所有的JVM全部遵守Java虚拟机规范:Java SE Specifications,也就是说所有的JV环境都是一样的,这样一来字节码文 ...

最新文章

  1. 照相机模型与增强现实(相机标定)
  2. 刺激赛场 连接服务器没有响应,英雄联盟为什么连接不上服务器(英雄联盟没有响应是什么原因)...
  3. java加密字符串,可解密
  4. expect 普通用户自动输入密码到root下,执行命令
  5. Linux 文件系统编程之系统调用和标准I/O库
  6. Matplotlib - 柱状图、直方图、条形图 bar() barh() 所有用法详解
  7. 云原生应用Go语言:你还在考虑的时候,别人已经应用实践
  8. SpringBoot_Redis配置
  9. python的装饰器、迭代器、yield_python的装饰器,迭代器,生成器(yield)
  10. 总结了一些很实用值得收藏的站点
  11. 51单片机采用ADC0808检测ADC_LCD1602显示
  12. 光纤交换机配置zone
  13. tunel凋亡试剂盒说明书_TUNEL细胞凋亡试剂盒内容及操作步骤(精)
  14. xp 无法关闭计算机,电脑xp系统关不了机,一直显示在正在关机为什么 除了重装,还能怎么办...
  15. 安卓集成facebook_设计和编码集成的Facebook应用程序:理论
  16. 868-超详细 DNS 协议解析
  17. XLNet 详解(看不懂你来骂我)
  18. 如何运用InSAR技术进行数据处理、地形三维重建、形变信息提取、监测
  19. 《基础微积分教材中译版》--11.3偏导数
  20. “中国探月工程”,“长征三号火箭”,“月球车”,英语怎么说?

热门文章

  1. 2023年全球及中国安全气囊行业头部企业市场占有率及排名调研报告
  2. 礼物包装 括号匹配 C语言栈操作
  3. 国内大学论文latex模板链接
  4. HMC5883电子罗盘数据输出,STM32代码
  5. Oracle 如何设置外键约束
  6. 欧盟商标注册 欧盟商标注册流程 马德里商标注册
  7. 学计算机网络的专科生考研,2019专科生考研计算机15个常见问题答疑
  8. 从菜鸟到顶级程序员的常用软件
  9. Y12型拖拉机轮圈落料与首次设计
  10. 热云数据全线能力介绍2021年8月