Class ClassLoaderDiagnostics
Provides static utility methods for diagnosing common ClassLoader-related issues
such as duplicate classes on the classpath, split packages across ClassLoaders, and
tracing the delegation chain for class loading. All methods use resource-based scanning
(getResources()) rather than loadClass() to avoid side effects.
提供静态工具方法,用于诊断常见的 ClassLoader 相关问题,
例如类路径上的重复类、跨 ClassLoader 拆分的包,以及跟踪类加载的委托链。
所有方法使用基于资源的扫描(getResources())而非 loadClass(),
以避免副作用。
Features | 主要功能:
- Find duplicate classes across ClassLoaders - 在多个 ClassLoader 中查找重复类
- Detect split packages - 检测拆分包
- Trace class loading delegation chain - 跟踪类加载委托链
- Locate class resources across loaders - 跨加载器定位类资源
Usage Examples | 使用示例:
// Find duplicate classes between two loaders
List<DuplicateClassReport> duplicates =
ClassLoaderDiagnostics.findDuplicateClasses(loader1, loader2);
// Trace a class loading path
ClassLoadTrace trace =
ClassLoaderDiagnostics.traceClassLoading("com.example.Foo", loader1);
Security | 安全性:
- Thread-safe: Yes (stateless utility class) - 线程安全: 是 (无状态工具类)
- No strong ClassLoader references in reports - 报告中不持有 ClassLoader 的强引用
- Since:
- JDK 25, opencode-base-classloader V1.0.3
- Author:
- Leon Soo www.LeonSoo.com
- See Also:
-
Method Summary
Modifier and TypeMethodDescriptionstatic List<PackageSplitReport> detectPackageSplits(ClassLoader... classLoaders) Detect packages that are split across multiple ClassLoaders 检测跨多个 ClassLoader 拆分的包findClassLocations(String className, ClassLoader... classLoaders) Find all resource locations for a class across the given ClassLoaders 在给定的 ClassLoader 中查找某个类的所有资源位置static List<DuplicateClassReport> findDuplicateClasses(ClassLoader... classLoaders) Find classes that exist in two or more of the given ClassLoaders 查找在两个或多个给定 ClassLoader 中存在的类static ClassLoadTracetraceClassLoading(String className, ClassLoader classLoader) Trace the class loading delegation chain for a given class name 跟踪给定类名的类加载委托链
-
Method Details
-
findDuplicateClasses
Find classes that exist in two or more of the given ClassLoaders 查找在两个或多个给定 ClassLoader 中存在的类Scans each ClassLoader using
getResources()for.classfiles. Returns a report for every class name found in at least two loaders.使用
getResources()扫描每个 ClassLoader 的.class文件。 返回至少在两个加载器中找到的每个类名的报告。- Parameters:
classLoaders- the ClassLoaders to scan | 要扫描的 ClassLoader- Returns:
- list of duplicate class reports, empty if no duplicates found | 重复类报告列表,如果没有发现重复则为空
- Throws:
NullPointerException- if classLoaders array or any element is null | 当 classLoaders 数组或任何元素为 null 时
-
detectPackageSplits
Detect packages that are split across multiple ClassLoaders 检测跨多个 ClassLoader 拆分的包Scans each ClassLoader for class resources and identifies packages whose classes appear in two or more loaders. Split packages can cause issues with the Java module system and may lead to runtime access errors.
扫描每个 ClassLoader 的类资源,识别其类出现在两个或多个加载器中的包。 拆分包可能导致 Java 模块系统问题,并可能导致运行时访问错误。
- Parameters:
classLoaders- the ClassLoaders to scan | 要扫描的 ClassLoader- Returns:
- list of package split reports | 包拆分报告列表
- Throws:
NullPointerException- if classLoaders array or any element is null | 当 classLoaders 数组或任何元素为 null 时
-
traceClassLoading
Trace the class loading delegation chain for a given class name 跟踪给定类名的类加载委托链Walks the parent chain from the given ClassLoader, trying
getResource()at each level. Returns aClassLoadTraceshowing every loader consulted and which one ultimately provides the class resource.从给定的 ClassLoader 向上遍历父链,在每个级别尝试
getResource()。 返回ClassLoadTrace,显示咨询的每个加载器以及最终提供类资源的加载器。- Parameters:
className- the fully qualified class name to trace | 要跟踪的完全限定类名classLoader- the starting ClassLoader | 起始 ClassLoader- Returns:
- the class load trace | 类加载跟踪记录
- Throws:
NullPointerException- if className or classLoader is null | 当 className 或 classLoader 为 null 时
-
findClassLocations
Find all resource locations for a class across the given ClassLoaders 在给定的 ClassLoader 中查找某个类的所有资源位置Converts the class name to a resource path and calls
getResources()on each ClassLoader, collecting all distinct URL strings.将类名转换为资源路径,并在每个 ClassLoader 上调用
getResources(), 收集所有不同的 URL 字符串。- Parameters:
className- the fully qualified class name | 完全限定类名classLoaders- the ClassLoaders to search | 要搜索的 ClassLoader- Returns:
- list of URL strings where the class resource was found | 找到类资源的 URL 字符串列表
- Throws:
NullPointerException- if className or classLoaders array or any element is null | 当 className 或 classLoaders 数组或任何元素为 null 时
-