贝壳三面:JDK1.8和1.9中类加载器有哪些不同?

文章内容收录到个人网站,方便阅读:http://hardyfish.top/

1. 类加载器简介

JVM 采用类加载器(ClassLoader) 来动态加载 .class 文件。从 JVM 角度来看,类加载器分为两类:

  1. 启动类加载器(Bootstrap ClassLoader) :用 C++ 实现,属于 JVM 本身的一部分。
  2. 其他 Java 实现的类加载器:继承自 java.lang.ClassLoader,用于加载应用程序类。

2. JDK 1.8 及之前的类加载器

JDK 1.8 及之前,Java 使用 3 种默认类加载器

启动类加载器(Bootstrap ClassLoader)

C++ 实现

加载

JAVA_HOME/lib

目录下的核心类库(如

rt.jar

扩展类加载器(Extension ClassLoader)

sun.misc.Launcher$ExtClassLoader

加载

JAVA_HOME/lib/ext

目录下的扩展类

应用类加载器(Application ClassLoader)

sun.misc.Launcher$AppClassLoader

加载

classpath

目录下的应用类

3. JDK 1.9 之后的类加载器变化

JDK 1.9 引入 Jigsaw 模块化系统(Project Jigsaw) ,对类加载器进行了调整:

扩展类加载器(Extension ClassLoader)

平台类加载器(Platform ClassLoader)

负责加载 JDK 模块化系统中的非核心模块

应用类加载器(Application ClassLoader)

应用类加载器(Application ClassLoader)

负责加载应用程序的

classpath

新的 Platform ClassLoader(平台类加载器)

  • JDK 1.9 之后,扩展类加载器被移除,改为 Platform ClassLoader。
  • Platform ClassLoader 作用:负责加载 JDK 平台 API 的非核心模块(如 java.sql)。不能直接访问 java.base 模块(由 Bootstrap ClassLoader 加载)。无法直接访问 classpath,但可以通过 ModuleLayer 访问。

4. JDK 1.8 vs JDK 1.9 类加载器结构

JDK 1.8 类加载器结构

Bootstrap ClassLoader
  ├── Extension ClassLoader
  │     ├── 加载 JAVA_HOME/lib/ext 目录
  ├── Application ClassLoader
        ├── 加载 classpath 目录
        ├── 自定义类加载器(User-defined ClassLoader)

JDK 1.9 类加载器结构

Bootstrap ClassLoader
  ├── Platform ClassLoader  (JDK 9+ 新增)
  │     ├── 加载 JDK 平台模块(如 java.sql)
  ├── Application ClassLoader
        ├── 加载 classpath 目录
        ├── 自定义类加载器(User-defined ClassLoader)

5. 类加载器的继承关系

类加载器并不是继承关系,而是组合关系,即父类加载器是一个 ClassLoader 类型的成员变量

public abstract class ClassLoader {
    private final ClassLoader parent;  // 组合关系
}

ClassLoader 内部,如果找不到类,会委派给 parent 继续查找

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    Class<?> c = findLoadedClass(name);
    if (c == null) {
        if (parent != null) {
            c = parent.loadClass(name, false);
        } else {
            c = findBootstrapClassOrNull(name);
        }
    }
    return c;


6. 关键变化总结

JDK 1.8 及之前

Bootstrap、Extension、Application

使用

Extension ClassLoader

加载

lib/ext

JDK 1.9 及之后

Bootstrap、

Platform

、Application

Extension ClassLoader

Platform ClassLoader

取代

7. 影响

  1. 模块化影响类加载 JDK 1.9 之后,类被封装在 module-info.java 中,非公开模块不能被直接访问。
  2. Platform ClassLoader 只能加载特定的 JDK 模块 不能直接加载 classpath 中的类。
  3. 自定义类加载器仍然适用 但需要在模块化环境下遵循新的访问规则。

8. 结论

  • JDK 1.9 之后,Platform ClassLoader 替代了 Extension ClassLoader
  • 类加载器仍然遵循双亲委派模型,但模块化影响了类加载机制
  • 自定义类加载器仍然适用,但需要遵循模块化规则
#面试题##面试#
大厂面试每日一题 文章被收录于专栏

大厂每日一道面试题!

全部评论

相关推荐

03-15 10:59
已编辑
美团_后端开发(实习员工)
爱写代码的菜code...:哎,自己当时拿到字节offer的时候也在感叹终于拿到了,自己当时最想去的企业就是字节,结果还是阴差阳错去了鹅厂。祝uu一切顺利!!!
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4274次浏览 75人参与
# AI面会问哪些问题? #
27625次浏览 552人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15156次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20087次浏览 342人参与
# 找AI工作可以去哪些公司? #
9011次浏览 233人参与
# 春招至今,你的战绩如何? #
64714次浏览 578人参与
# 厦门银行科技岗值不值得投 #
7987次浏览 188人参与
# 从事AI岗需要掌握哪些技术栈? #
8860次浏览 302人参与
# 你做过最难的笔试是哪家公司 #
33267次浏览 231人参与
# 中国电信笔试 #
31977次浏览 292人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340747次浏览 2174人参与
# 哪些公司真双非友好? #
69570次浏览 289人参与
# 阿里笔试 #
178475次浏览 1315人参与
# 机械人避雷的岗位/公司 #
62698次浏览 393人参与
# 第一份工作一定要去大厂吗 #
14491次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22065次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26245次浏览 310人参与
# 沪漂/北漂你觉得哪个更苦? #
9797次浏览 193人参与
# HR最不可信的一句话是__ #
6195次浏览 113人参与
# 应届生第一份工资要多少合适 #
20674次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11470次浏览 341人参与
# 春招你拿到offer了吗 #
831151次浏览 9986人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务