千家信息网

Java的ClassLoader如何理解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了Java的ClassLoader如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。讲解一下 Java 的 ClassLoader。关于
千家信息网最后更新 2026年11月03日Java的ClassLoader如何理解

本篇文章为大家展示了Java的ClassLoader如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

讲解一下 Java 的 ClassLoader。

关于 ClassLoader ,相信大家用的不是很多,但是在面试中可能会被经常问到。所以我这里整理了关于它的一些相关用法。

ClassLoader 是 Java 提供的类加载器,用来加载 Java 类到 Java 虚拟机中的一种加载器。

Java 程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。

当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

了解了上面的流程后,我们再通过具体的代码来看看类是如何被加载的。

1

2

3

4

5

6

7

8

9

package com.neo.classloader;

public class ClassLoaderTest {

public static void main(String[] args) {

ClassLoader loader = Thread.currentThread().getContextClassLoader();

System.out.println(loader);

System.out.println(loader.getParent());

System.out.println(loader.getParent().getParent());

}

}

运行后,输出结果:

1

2

3

sun.misc.Launcher$AppClassLoader@64fef26a

sun.misc.Launcher$ExtClassLoader@1ddd40f3

null

从上面的结果可以看出,并没有获取到 ExtClassLoader 的父 Loader,原因是 Bootstrap Loader(引导类加载器)是用C语言实现的,找不到一个确定的返回父 Loader 的方式,于是就返回 null。 这几种类加载器的层次关系如下图所示:


注意:这里父类加载器并不是通过继承关系来实现的,而是采用组合实现的。

站在Java虚拟机的角度来讲,只存在两种不同的类加载器:启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有很多其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分;所有其它的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。

站在Java开发人员的角度来看,类加载器可以大致划分为以下三类:

启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.开头的类均被Bootstrap ClassLoader加载)。启动类加载器是无法被Java程序直接引用的。
扩展类加载器:Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载JDK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.
开头的类),开发者可以直接使用扩展类加载器。
应用程序类加载器:Application ClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,因此如果编写了自己的ClassLoader,便可以做到如下几点:

  • 1、在执行非置信代码之前,自动验证数字签名。

  • 2、动态地创建符合用户特定需要的定制化构建类。

  • 3、从特定的场所取得java class,例如数据库中和网络中。

JVM类加载机制

  • 全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入

  • 父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类

  • 缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效

类加载有三种方式:

  • 1、命令行启动应用时候由JVM初始化加载

  • 2、通过Class.forName()方法动态加载

  • 3、通过ClassLoader.loadClass()方法动态加载

例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

package com.xttblog.classloader;

public class loaderTest {

public static void main(String[] args) throws ClassNotFoundException {

ClassLoader loader = HelloWorld.class.getClassLoader();

System.out.println(loader);

loader.loadClass("Test2");

}

}

Test2.java

1

2

3

4

5

public class Test2 {

static {

System.out.println("静态初始化块执行了!");

}

}

分别切换加载方式,会有不同的输出结果。

Class.forName()和ClassLoader.loadClass()区别

  • Class.forName():将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块;

  • ClassLoader.loadClass():只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

  • Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。

总结:Java 类的加载机制和ClassLoader看似复杂,实际上却很简单。通过阅读源码或结合运行示例就能更好的理解了。

上述内容就是Java的ClassLoader如何理解,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

程序 运行 就是 文件 应用 只有 应用程序 开头 机制 目录 语言 路径 代码 内容 动态 方式 方法 系统 结果 缓存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 科技创新与互联网经济 互联网和科技创新 北京互联网科技 嘟嘟瓜互联网科技 万易互联网科技有限公司 壕鑫互联网络科技 互联网金融监管科技 玖二柒互联网科技公司待遇 宁波青枫互联网科技有限公司 互联网企业和科技型企业 成都铂石互联网科技做什么的 岳阳华臻互联网科技有限公司 威龙国际互联网科技公司 滨湖区互联网智能科技产品有哪些 锡山区互联网智能科技产品供应 智帮互联网科技公司最近动向 中国互联网有什么科技 2021世界互联网领先科技成果发布 全球科技与互联网公司市值变化 互联网公司 科技公司 金融科技 互联网金融 丰台科技园 互联网公司 华中科技有哪些互联网大佬 科技赋能互联网健康 须眉科技是互联网公司吗 本届互联网博览会上的黑科技 佛山市拉法互联网科技有限公司 互联网金融运营模式中的金融科技 互联网的科技体现在哪里
0