简介
# 📚简介
Hutool的类加载器模块提供了一系列便捷的类加载工具,简化了类加载器的获取、资源加载和外部Jar加载等操作。该模块包含多个核心类,用于处理不同场景下的类加载需求。
# 🏗️核心类结构
| 类名 | 主要职责 | 核心功能 |
|---|---|---|
ClassLoaderUtil | 类加载器工具类 | 提供类加载器获取、类加载等静态方法 |
JarClassLoader | 外部Jar的类加载器 | 加载外部Jar文件和目录中的类 |
ResourceClassLoader | 资源类加载器 | 加载任意类型资源中的类 |
# 🔧核心功能
# 1. 类加载器获取
ClassLoaderUtil 提供了多种获取类加载器的方式,包括:
- 获取当前线程的ContextClassLoader
- 获取调用者的ClassLoader
- 获取系统ClassLoader
- 获取自定义ClassLoader
# 2. 类加载
支持多种场景的类加载:
- 加载指定名称的类
- 加载原始类型、数组类型和内部类
- 加载外部Jar或目录中的类
- 延迟加载和初始化控制
# 3. 外部资源加载
- 加载外部Jar文件到ClassPath
- 加载目录中的所有Jar文件
- 加载任意资源中的类
# 🚀快速开始
# 1. 获取类加载器
// 获取默认类加载器
ClassLoader classLoader = ClassLoaderUtil.getClassLoader();
// 获取当前线程的ContextClassLoader
ClassLoader contextClassLoader = ClassLoaderUtil.getContextClassLoader();
// 获取系统ClassLoader
ClassLoader systemClassLoader = ClassLoaderUtil.getSystemClassLoader();
# 2. 加载类
// 加载普通类
Class<?> userClass = ClassLoaderUtil.loadClass("com.example.User");
// 加载原始类型
Class<?> intClass = ClassLoaderUtil.loadClass("int");
// 加载数组类型
Class<?> stringArrayClass = ClassLoaderUtil.loadClass("java.lang.String[]");
// 加载内部类
Class<?> threadStateClass = ClassLoaderUtil.loadClass("java.lang.Thread.State");
# 3. 加载外部Jar
// 加载单个Jar文件
JarClassLoader jarLoader = JarClassLoader.load(new File("/path/to/your.jar"));
Class<?> externalClass = jarLoader.loadClass("com.external.Class");
// 加载目录中的所有Jar
JarClassLoader dirLoader = JarClassLoader.load(new File("/path/to/jar/dir"));
Class<?> dirClass = dirLoader.loadClass("com.dir.Class");
// 便捷加载外部类
Class<?> quickClass = ClassLoaderUtil.loadClass(new File("/path/to/your.jar"), "com.external.Class");
# 4. 资源类加载
// 创建资源映射
Map<String, Resource> resourceMap = new HashMap<>();
resourceMap.put("com.example.CustomClass", new FileResource("/path/to/CustomClass.class"));
// 创建资源类加载器
ResourceClassLoader<Resource> resourceClassLoader = new ResourceClassLoader<>(null, resourceMap);
// 加载资源中的类
Class<?> customClass = resourceClassLoader.loadClass("com.example.CustomClass");
// 动态添加资源并加载
resourceClassLoader.addResource(new UrlResource("https://example.com/AnotherClass.class"));
Class<?> anotherClass = resourceClassLoader.loadClass("com.example.AnotherClass");
# 📝高级用法
# 1. 类存在性检查
// 检查类是否存在
boolean isPresent = ClassLoaderUtil.isPresent("com.example.ExistingClass");
if (isPresent) {
// 类存在,进行相应处理
}
# 2. 加载类到系统ClassLoader
// 将Jar加载到系统ClassLoader
URLClassLoader systemLoader = JarClassLoader.loadJarToSystemClassLoader(new File("/path/to/your.jar"));
// 现在可以直接使用Class.forName加载Jar中的类
Class<?> systemClass = Class.forName("com.external.Class");
# 3. 自定义类加载器链
// 创建自定义类加载器链
ClassLoader parentLoader = new URLClassLoader(new URL[]{});
JarClassLoader childLoader = new JarClassLoader(new URL[]{}, parentLoader);
childLoader.addJar(new File("/path/to/child.jar"));
// 优先从childLoader加载类
Class<?> chainedClass = childLoader.loadClass("com.chained.Class");
# 🎯设计优势
- 简单易用:提供静态工具方法,一行代码即可完成类加载器获取和类加载
- 灵活扩展:支持多种类加载场景,包括外部Jar和资源加载
- 智能选择:自动选择合适的类加载器,无需手动指定
- 安全可靠:继承自URLClassLoader和SecureClassLoader,保证加载安全
- 缓存机制:ResourceClassLoader内置类缓存,提高加载效率
- 多场景支持:适用于普通类加载、外部Jar加载、资源类加载等多种场景
# 📌注意事项
- 类加载器遵循双亲委派模型,注意类加载顺序
- 加载外部Jar时,注意Jar文件的完整性和兼容性
- 资源类加载器适用于动态加载场景,生产环境建议使用静态加载
- 类加载后无法卸载,注意内存使用
- 不同类加载器加载的相同类名的类,在JVM中视为不同的类
# 📚相关文档
- Java类加载机制 (opens new window)
- URLClassLoader官方文档 (opens new window)
- SecureClassLoader官方文档 (opens new window)
通过Hutool的类加载器模块,您可以轻松处理各种复杂的类加载场景,简化开发流程,提高代码的灵活性和可扩展性。