Java ClassLoader

Java ClassLoader 是 Java 虚拟机中负责把 `.class` 文件加载进内存的组件,和类加载机制、类路径配置以及程序运行时的类查找直接相关。简单说,它决定了 JVM 从哪里、按什么顺序把类“读进来”并准备使用。
基本含义与用途
ClassLoader 的核心工作是把字节码加载成 JVM 可用的类对象,并完成链接和初始化前的准备。Java 采用双亲委派模型:收到加载请求时,先交给父加载器尝试,父加载器找不到才由自己加载。常见层次包括启动类加载器、扩展类加载器(新版本中为平台类加载器)和应用类加载器。它的用途不只是启动程序,还支撑热部署、插件隔离、模块化加载等场景,比如应用服务器让不同 Web 应用使用各自独立的类加载器,避免类冲突。
常见问题
最典型的是 `ClassNotFoundException` 和 `NoClassDefFoundError`:前者表示运行时在类路径中找不到指定类,后者表示编译时存在但运行时初始化失败或缺失。还有 `LinkageError`、类冲突(同一个类被不同加载器加载出多个版本)、静态变量不共享等问题。双亲委派被打破时(如 SPI、OSGi、自定义加载器),也容易出现“明明有类却加载不到”的现象。
怎么判断与怎么选
排查时先看异常类型和堆栈,确认是“找不到”还是“加载失败”;再用 `-verbose:class` 或类加载日志观察实际加载来源;检查类路径、依赖版本和加载器层次是否一致。选择上,普通应用优先使用默认的应用程序类加载器,不要随意自定义;需要隔离或热替换时,才考虑自定义 ClassLoader,并明确父子关系与委派策略。若涉及模块化,优先使用 Java 平台提供的模块机制,而不是手工造加载器。