Hutool Hutool
(opens new window)
🏡首页
📖指南
🎢最佳实践
💖支持
💡javaDoc (opens new window)
⏳更新记录 (opens new window)
  • 🍎gitee (opens new window)
  • 🍏github (opens new window)
(opens new window)
🏡首页
📖指南
🎢最佳实践
💖支持
💡javaDoc (opens new window)
⏳更新记录 (opens new window)
  • 🍎gitee (opens new window)
  • 🍏github (opens new window)
  • 快速入门

  • 核心(hutool-core)

    • AI(Hutool-ai)

    • 注解(annotation)

    • 数组(array)

    • JavaBean(bean)

    • 缓存(cache)

    • 类加载器(classloader)

      • 简介
      • 类加载器-ClassLoaderUtil
      • 外部Jar加载器-JarClassLoader
        • 📚 介绍
          • 设计理念
        • 🔧 核心方法详解
          • 1. 静态工厂方法
          • load(File dir)
          • loadJar(File jarFile)
          • loadJar(URLClassLoader loader, File jarFile)
          • loadJarToSystemClassLoader(File jarFile)
          • 2. 构造方法
          • JarClassLoader()
          • JarClassLoader(URL[] urls)
          • JarClassLoader(URL[] urls, ClassLoader classLoader)
          • 3. 实例方法
          • addJar(File jarFileOrDir)
          • addURL(URL url)
          • addURL(File dir)
        • 🚀 综合示例
          • 示例1:加载外部 Jar 文件
          • 示例2:加载目录中的所有 Jar 文件
          • 示例3:动态添加资源
          • 示例4:加载到系统类加载器
        • 🎯 最佳实践
          • 1. 资源管理
          • 2. 安全考虑
          • 3. 性能优化
        • 📌 注意事项
        • 🚀 总结
      • 资源类加载器-ResourceClassLoader
    • 编码解码(codec)

    • 集合(collection)

    • 比较器(comparator)

    • 压缩(compress)

    • 类型转换(convert)

    • 数据(data)

    • 日期时间(date)

    • 异常(exception)

    • 函数(func)

    • IO流(io)

    • 语言特性(lang)

    • Map(map)

    • 数字数学(math)

    • 网络(net)

    • 对象池(pool)

    • 反射(reflect)

    • 正则(regex)

    • 服务提供(spi)

    • 聚合操作(stream)

    • 字符串文本(text)

    • 并发和线程(thread)

    • 树结构(tree)

    • 工具集合(util)

    • XML操作(xml)

  • 定时任务(hutool-cron)

  • 加密(hutool-crypto)

  • 数据库(hutool-db)

  • 扩展(hutool-extra)

  • HTTP(hutool-http)

  • 日志(hutool-log)

  • 配置文件(hutool-setting)

  • JSON(hutool-json)

  • Office办公(hutool-poi)

  • 套接字(hutool-socket)

  • GUI(hutool-swing)

  • 指南
  • 核心(hutool-core)
  • 类加载器(classloader)
Hutool
2026-01-03
目录

外部Jar加载器-JarClassLoader

# 📚 介绍

JarClassLoader 是 Hutool 核心模块中的外部 Jar 类加载器,继承自 Java 原生的 URLClassLoader,专门用于加载外部 Jar 文件和目录中的类。它提供了便捷的 API 来动态加载外部资源,扩展了 Java 原生类加载器的功能。

# 设计理念

  • 动态加载:支持在运行时动态加载外部 Jar 文件
  • 批量加载:支持加载目录中的所有 Jar 文件
  • 便捷 API:提供简单易用的静态方法和实例方法
  • 继承扩展:基于 URLClassLoader,兼容 Java 原生类加载机制
  • 安全可靠:遵循类加载器双亲委派模型,保证加载安全

# 🔧 核心方法详解

# 1. 静态工厂方法

# load(File dir)

功能:加载 Jar 到 ClassPath,支持加载单个 Jar 文件或目录中的所有 Jar 文件和 class 文件

参数:

  • dir:jar 文件或所在目录

返回值:初始化好的 JarClassLoader 实例

示例:

// 加载单个 Jar 文件
JarClassLoader jarLoader1 = JarClassLoader.load(new File("/path/to/library.jar"));

// 加载目录中的所有 Jar 文件和 class 文件
JarClassLoader jarLoader2 = JarClassLoader.load(new File("/path/to/resources"));

# loadJar(File jarFile)

功能:加载单个 Jar 文件到 ClassPath

参数:

  • jarFile:jar 文件

返回值:初始化好的 JarClassLoader 实例

示例:

JarClassLoader jarLoader = JarClassLoader.loadJar(new File("/path/to/library.jar"));
// 仅加载指定的单个 Jar 文件

# loadJar(URLClassLoader loader, File jarFile)

功能:加载 Jar 文件到指定的 URLClassLoader 中

参数:

  • loader:目标 URLClassLoader
  • jarFile:被加载的 jar 文件

示例:

URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
JarClassLoader.loadJar(urlClassLoader, new File("/path/to/library.jar"));
// 将 Jar 文件加载到系统类加载器中

# loadJarToSystemClassLoader(File jarFile)

功能:加载 Jar 文件到系统 ClassLoader 中

参数:

  • jarFile:被加载的 jar 文件

返回值:系统 ClassLoader

示例:

URLClassLoader systemLoader = JarClassLoader.loadJarToSystemClassLoader(
    new File("/path/to/library.jar"));
// 现在可以直接使用 Class.forName 加载 Jar 中的类
Class<?> externalClass = Class.forName("com.external.Class");

# 2. 构造方法

# JarClassLoader()

功能:默认构造方法,创建一个空的 JarClassLoader

示例:

JarClassLoader jarLoader = new JarClassLoader();
// 创建一个空的 JarClassLoader,后续可以动态添加资源

# JarClassLoader(URL[] urls)

功能:使用指定的 URL 数组创建 JarClassLoader

参数:

  • urls:被加载的 URL 数组

示例:

URL[] urls = new URL[]{new URL("file:/path/to/library.jar")};
JarClassLoader jarLoader = new JarClassLoader(urls);
// 使用指定的 URL 数组创建 JarClassLoader

# JarClassLoader(URL[] urls, ClassLoader classLoader)

功能:使用指定的 URL 数组和父类加载器创建 JarClassLoader

参数:

  • urls:被加载的 URL 数组
  • classLoader:父类加载器

示例:

URL[] urls = new URL[]{new URL("file:/path/to/library.jar")};
ClassLoader parentLoader = ClassLoaderUtil.getClassLoader();
JarClassLoader jarLoader = new JarClassLoader(urls, parentLoader);
// 使用指定的 URL 数组和父类加载器创建 JarClassLoader

# 3. 实例方法

# addJar(File jarFileOrDir)

功能:加载 Jar 文件或目录中的所有 Jar 文件

参数:

  • jarFileOrDir:jar 文件或者 jar 文件所在目录

返回值:当前 JarClassLoader 实例,支持链式调用

示例:

JarClassLoader jarLoader = new JarClassLoader();
// 添加单个 Jar 文件
jarLoader.addJar(new File("/path/to/library1.jar"));
// 添加目录中的所有 Jar 文件
jarLoader.addJar(new File("/path/to/jars"));

# addURL(URL url)

功能:添加单个 URL 到类加载路径

参数:

  • url:要添加的 URL

示例:

JarClassLoader jarLoader = new JarClassLoader();
jarLoader.addURL(new URL("file:/path/to/library.jar"));
// 添加单个 URL 到类加载路径

# addURL(File dir)

功能:增加 class 所在目录或文件到类加载路径

参数:

  • dir:目录或 Jar 文件

返回值:当前 JarClassLoader 实例,支持链式调用

示例:

JarClassLoader jarLoader = new JarClassLoader();
// 添加目录
jarLoader.addURL(new File("/path/to/classes"));
// 添加 Jar 文件
jarLoader.addURL(new File("/path/to/library.jar"));

# 🚀 综合示例

# 示例1:加载外部 Jar 文件

public void loadExternalJarTest() {
    // 加载外部 Jar 文件
    JarClassLoader jarLoader = JarClassLoader.load(
        new File("/path/to/external-library.jar"));

    // 使用加载的类
    try {
        // 加载 Jar 中的类
        Class<?> utilsClass = jarLoader.loadClass("com.external.library.Utils");

        // 使用反射调用类的方法
        Object utilsInstance = utilsClass.getDeclaredConstructor().newInstance();
        Method method = utilsClass.getMethod("doSomething");
        Object result = method.invoke(utilsInstance);

        Console.log("调用外部方法结果:" + result);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

# 示例2:加载目录中的所有 Jar 文件

public void loadDirectoryJarsTest() {
    // 加载目录中的所有 Jar 文件
    JarClassLoader jarLoader = JarClassLoader.load(
        new File("/path/to/external/resources"));

    // 加载多个类
    try {
        Class<?> class1 = jarLoader.loadClass("com.external.Class1");
        Class<?> class2 = jarLoader.loadClass("com.external.Class2");
        Class<?> class3 = jarLoader.loadClass("com.external.Class3");

        Console.log("成功加载类:");
        Console.log("  - " + class1.getName());
        Console.log("  - " + class2.getName());
        Console.log("  - " + class3.getName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

# 示例3:动态添加资源

public void dynamicAddResourcesTest() {
    // 创建空的 JarClassLoader
    JarClassLoader jarLoader = new JarClassLoader();

    // 动态添加多个 Jar 文件
    jarLoader.addJar(new File("/path/to/library1.jar"))
            .addJar(new File("/path/to/library2.jar"))
            .addJar(new File("/path/to/library3.jar"))
            .addURL(new File("/path/to/classes"));

    // 使用加载的类
    try {
        Class<?> dynamicClass = jarLoader.loadClass("com.dynamic.Class");
        Console.log("动态加载类成功:" + dynamicClass.getName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

# 示例4:加载到系统类加载器

public void loadToSystemClassLoaderTest() {
    // 将外部 Jar 加载到系统类加载器
    URLClassLoader systemLoader = JarClassLoader.loadJarToSystemClassLoader(
        new File("/path/to/external-library.jar"));

    // 现在可以直接使用 Class.forName 加载 Jar 中的类
    try {
        Class<?> externalClass = Class.forName("com.external.library.Utils");
        Console.log("从系统类加载器加载外部类成功:" + externalClass.getName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

# 🎯 最佳实践

# 1. 资源管理

  • 及时释放:不再使用的类加载器应该被及时释放,避免内存泄漏
  • 合理组织:将相关的外部资源放在同一目录下,便于批量加载
  • 版本控制:注意外部 Jar 文件的版本兼容性

# 2. 安全考虑

  • 验证来源:只加载来自可信来源的 Jar 文件,避免安全风险
  • 权限控制:根据需要设置适当的安全策略
  • 异常处理:妥善处理类加载过程中可能出现的异常

# 3. 性能优化

  • 按需加载:只加载必要的外部资源,避免不必要的性能开销
  • 缓存复用:对频繁使用的类加载器进行缓存,避免重复创建
  • 并行加载:对于大量外部资源,可以考虑并行加载

# 📌 注意事项

  1. 类加载器隔离:每个 JarClassLoader 实例都有自己的类加载空间,不同实例加载的相同类名的类视为不同的类
  2. 双亲委派模型:JarClassLoader 遵循类加载器双亲委派模型,优先从父类加载器加载类
  3. 资源冲突:注意避免不同外部资源之间的类名冲突
  4. 内存使用:每个类加载器实例都会占用一定的内存,注意资源使用
  5. 线程安全:JarClassLoader 是线程安全的,可以在多线程环境下使用

# 🚀 总结

JarClassLoader 是一个功能强大、使用便捷的外部 Jar 类加载器,为 Java 开发者提供了动态加载外部资源的解决方案。它继承自 Java 原生的 URLClassLoader,兼容 Java 原生类加载机制,同时提供了更便捷的 API。

无论是加载单个外部 Jar 文件,还是加载目录中的所有 Jar 文件,JarClassLoader 都能轻松应对。通过合理使用 JarClassLoader,可以实现插件化开发、动态扩展功能等高级应用场景。

JarClassLoader 是 Hutool 类加载器模块中的重要组成部分,与 ClassLoaderUtil 和 ResourceClassLoader 一起,构成了完整的类加载解决方案,为 Java 开发者提供了丰富的类加载工具。

类加载器-ClassLoaderUtil
资源类加载器-ResourceClassLoader

← 类加载器-ClassLoaderUtil 资源类加载器-ResourceClassLoader→

Theme by Vdoing | Copyright © 2025-2026 Hutool | Apache-2.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式