https://qianfan.cloud.baidu.com/qianfandev/topic/362378
文章目录
一、类加载器的分类【理解】
- 1.4 ClassLoader 中的两个方法【应用】
二、双亲委派模型【理解】
三、小节
一、类加载器的分类【理解】
1.1 概述
类加载器分为两类,一类是Java代码中实现的,一类是Java虚拟机底层源码实现的。
- 虚拟机底层实现:源代码位于Java虚拟机的源码中,实现语言与虚拟机底层语言一致,比如Hotspot使用C++。主要目的是保证Java程序运行的基础类被正确地加载,比如java.lang.String,Java虚拟机需要确保其可靠性。
- JDK中默认提供或者自定义(重点关注):JDK中默认提供了多种处理不同渠道的类加载器,程序员也可以自己根据需求使用Java语言定制。所有Java中实现的类加载器都需要继承ClassLoader这个抽象类。
类加载器的设计,JDK8和8之后的版本差别较大(JDK9之后,出现了模块化设计)。
1.2 JDK8及之前的版本
首先来看JDK8及之前的版本,JDK8及之前的版本中默认的类加载器有如下几种:
- 启动类加载器(Bootstrap ClassLoader、C++实现):加载JAVA\_HOME/jre/lib目录下的库,加载核心类,String类。它是JVM的一部分,负责加载Java核心类库,如java.lang包中的类。它是最顶层的类加载器,通常使用C++实现,无法在Java代码中直接获取到。通常表示为null ,并且没有父null(通用且重要)
- 扩展类加载器(Extension ClassLoader、Java实现):主要加载JAVA\_HOME/jre/lib/ext目录中的类。加载扩展类,拓展Java中比较通用的类,只是通用,不是特别重要,最重要的在启动类加载器加载了。通常位于JRE的lib/ext目录下
- 应用程序类加载器(Application ClassLoader、Java实现):也称为系统类加载器(System ClassLoader),加载classPath下的类。加载应用classpath中的类,包括我们自己写的类,还有第三方Jar包的类