【Java-JVM】什么是类加载器?

在这里插入图片描述

🚀 Java类加载器详解

类加载器(ClassLoader)是Java虚拟机(JVM)的核心组件之一,负责将.class字节码文件加载到内存中,并转换成JVM可执行的Java类。简单说,它就像图书馆管理员,负责把书籍(字节码)从书架(磁盘/网络)搬到读者(JVM)面前。


一、核心作用

  1. 加载(Loading)
    • 查找.class文件(本地磁盘、网络等)
    • 将字节码读入内存
  2. 链接(Linking)
    • 验证:检查字节码合法性(比如是否篡改)
    • 准备:为静态变量分配内存并赋默认值(如int默认0)
    • 解析:将符号引用转为直接引用(例如java.lang.String替换为内存地址)
  3. 初始化(Initialization)
    • 执行静态代码块和静态变量赋值(如static int a=5;

📖 故事比喻
小明(JVM)想读《Java编程思想》(类)。

  • 管理员(ClassLoader)先去"中央书库"(Bootstrap ClassLoader)找书
  • 找不到就去"扩展书库"(Extension ClassLoader)
  • 最后在"个人书架"(Application ClassLoader)找到书
  • 管理员检查书是否完整(验证),贴好标签(准备),翻开第一页(初始化)

二、类加载器层次结构(双亲委派模型)

启动类加载器
Bootstrap ClassLoader
扩展类加载器
Extension ClassLoader
应用类加载器
Application ClassLoader
自定义类加载器
Custom ClassLoader
  1. 启动类加载器(Bootstrap)
    • C++实现,加载JRE/lib/rt.jar核心库(如java.lang.*
    • 唯一没有父类的加载器
  2. 扩展类加载器(Extension)
    • Java实现,加载JRE/lib/ext/*.jar
  3. 应用类加载器(Application)
    • 加载CLASSPATH指定的用户程序
  4. 自定义加载器(Custom)
    • 用户继承ClassLoader实现(如Tomcat的WebappClassLoader)

三、双亲委派机制

工作流程:
  1. 收到加载请求时,先委托给父加载器
  2. 父加载器无法完成时,自己才尝试加载
  3. 所有父加载器失败 → 抛出ClassNotFoundException
✅ 优势:
  • 安全:防止核心类被篡改(如自定义java.lang.String无效)
  • 避免重复:保证类全局唯一性
  • 隔离性:不同加载器的类互不可见(如Tomcat隔离Web应用)
❌ 打破双亲委派的场景:
  1. SPI机制(如JDBC驱动)
    • 核心库java.sql.Driver需调用实现类(如com.mysql.cj.jdbc.Driver
    • 用**线程上下文类加载器(Thread Context ClassLoader)**反向委托
  2. 热部署(如OSGi框架)
    • 每个模块独立加载器,动态替换类

🔍 示例代码:查看类加载器

public class ClassLoaderDemo {
    public static void main(String[] args) {
        // 查看String类的加载器(Bootstrap显示为null)
        System.out.println(String.class.getClassLoader()); 
        
        // 查看当前类的加载器(通常是ApplicationClassLoader)
        System.out.println(ClassLoaderDemo.class.getClassLoader()); 
    }
}

四、自定义类加载器

继承ClassLoader并重写findClass()方法:

public class MyClassLoader extends ClassLoader {
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // 1. 读取字节码文件到byte[]
        byte[] data = loadClassData(name); 
        // 2. 调用defineClass生成Class对象
        return defineClass(name, data, 0, data.length); 
    }
}

应用场景

  • 加密/解密字节码
  • 从非标准路径加载类(如数据库、网络)
  • 实现热更新

💎 总结

特性说明
核心职责加载 → 链接 → 初始化
双亲委派自底向上委托,自顶向下加载
加载器层级Bootstrap → Extension → Application → Custom
打破委派场景SPI机制、热部署、OSGi框架
自定义加载器意义实现类隔离、热更新、字节码加密

📌 关键点
类加载器是JVM的"物流系统",通过双亲委派保障安全与稳定,而灵活的自定义机制为动态扩展打开大门。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java自学之旅

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值