Class ClassLoaderDiagnostics

java.lang.Object
cloud.opencode.base.classloader.diagnostic.ClassLoaderDiagnostics

public final class ClassLoaderDiagnostics extends Object
ClassLoader diagnostics utility for detecting classpath issues ClassLoader 诊断工具,用于检测类路径问题

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 Details

    • findDuplicateClasses

      public static List<DuplicateClassReport> findDuplicateClasses(ClassLoader... classLoaders)
      Find classes that exist in two or more of the given ClassLoaders 查找在两个或多个给定 ClassLoader 中存在的类

      Scans each ClassLoader using getResources() for .class files. 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

      public static List<PackageSplitReport> detectPackageSplits(ClassLoader... classLoaders)
      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

      public static ClassLoadTrace traceClassLoading(String className, ClassLoader classLoader)
      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 a ClassLoadTrace showing 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

      public static List<String> findClassLocations(String className, ClassLoader... classLoaders)
      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 时