一、ClassLoader 的基础结构
Java 的 ClassLoader 体系本身是分层的,主要有三类:
- Bootstrap ClassLoader(启动类加载器):负责加载 Java 核心类库(rt.jar),在 Java 层不可见(返回为 null)。
- Extension ClassLoader(扩展类加载器):加载 JDK 的扩展库(jre/lib/ext)。
- Application ClassLoader(系统类加载器):加载用户 classpath 下的类和资源。
每个 ClassLoader 都有父子关系,遵循“委托机制”。
二、在 debug 过程中能看到哪些信息?如何深入获取?
1. ClassLoader 的类型与层级
- 你可以直接看到当前 ClassLoader 的类型(如
AppClassLoader、URLClassLoader或自定义 ClassLoader)。 - 可以通过
getParent()递归查看其父 ClassLoader,直到 null(Bootstrap)。 - 这有助于你理解当前类是由哪个层级的 ClassLoader 加载的。
代码例子:
ClassLoader cl = CommonInfo.class.getClassLoader();
while (cl != null) {
System.out.println(cl.getClass().getName());
cl = cl.getParent();
}
2. ClassLoader 能加载的路径(Classpath/Jar)
- 对于
URLClassLoader(主流应用类加载器),可以通过getURLs()方法获得所有它能加载的 jar 包和目录。 - 这就是你的项目、依赖库的物理位置。
代码例子:
if (cl instanceof URLClassLoader) {
for (URL url : ((URLClassLoader) cl).getURLs()) {
System.out.println(url);
}
}
- 在 debug 工具中,也能展开这些成员变量,看到路径列表。
3. 资源查找能力
- 你可以用
getResource(String name)或getResources(String name)来查找任意资源文件(如 properties、xml、图片等)。 - 在 debug 时,可以输入不同资源名,验证它是否能被当前 ClassLoader 找到,并得到其 URL。
代码例子:
URL resourceUrl = cl.getResource("some/resource/path.properties");
System.out.println(resourceUrl);
4. 已加载的类信息
注意:标准 Java API 不提供直接查询“已加载的类”的接口。
- JVM 内部其实维护着每个 ClassLoader 已加载类的列表,但只能通过 JVM 工具(如 JMX、JVMTI、VisualVM)或诊断 API 获取。
- 在 debug 时,不能直接通过 ClassLoader 获得这些信息,但可以通过工具查看整个 JVM 已加载的类,间接知道某个 ClassLoader 加载了哪些类。
5. 自定义 ClassLoader 的内部状态
- 如果你用的是自定义 ClassLoader,在 debug 时可以直接访问其成员变量,如缓存、加载日志、配置信息等。
- 这对于分析类加载行为、定位类冲突等问题很有帮助。
6. ClassLoader 的加载方法和策略
- 你可以追踪其
findClass、loadClass方法,在 debug 时设置断点,观察类加载流程。 - 可以看到是否走了父委托,是否自定义了加载逻辑。
三、实际 debug 工具操作
在 IDE(如 IntelliJ IDEA)中断点时:
- 你可以查看对象的类型(class name)。
- 展开对象,看到成员变量(如 URLClassLoader 的 urls 数组)。
- 直接调用相关方法(Evaluate Expression),如
cl.getResource(...)、cl.getURLs()。 - 递归查看父 ClassLoader 的信息。
如需更深入(如 JVM 层面的已加载类),可以用 JMX、VisualVM、JFR 等诊断工具。
四、总结归纳
在 debug 时,通过 ClassLoader,你深入能获得:
- 类型与层级结构(AppClassLoader、ExtClassLoader、自定义等)
- 可加载的物理路径列表(classpath、jar 包等)
- 资源查找能力(资源文件的实际路径和 URL)
- 自定义 ClassLoader 的内部状态
- 类加载流程和委托机制
但不能直接获得“已加载类列表”,这需要借助 JVM 诊断工具。

3902

被折叠的 条评论
为什么被折叠?



