java中可通过getclassloader()获取类加载器:返回null为启动类加载器,appclassloader为应用类加载器,extclassloader为扩展类加载器,自定义类加载器则返回其全限定名。

在 Java 中,可以通过调用类的 getClassLoader() 方法获取加载该类的 ClassLoader 实例,再通过其 toString() 或具体类型判断来确认是哪个加载器。
直接获取并打印类加载器
每个 Class 对象都提供 getClassLoader() 方法:
- 返回
null表示由**启动类加载器(Bootstrap ClassLoader)**加载(如java.lang.String); - 返回
sun.misc.Launcher$AppClassLoader(或jdk.internal.loader.ClassLoaders$AppClassLoader)表示由**应用类加载器**加载; - 返回
sun.misc.Launcher$ExtClassLoader(或类似名称)表示由**扩展类加载器**加载; - 若为自定义类加载器,则返回对应实现类的全限定名。
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ClassLoader loader = clazz.getClassLoader();
System.out.println("String is loaded by: " + loader); // 输出 null
clazz = YourCustomClass.class;
loader = clazz.getClassLoader();
System.out.println("YourCustomClass is loaded by: " + loader);
区分三种核心类加载器的方法
由于 Bootstrap ClassLoader 是 C++ 实现、没有 Java 对象,所以只能靠是否为 null 判断;其他两个可通过 instanceof 或类名判断:
-
loader == null→ Bootstrap 类加载器 -
loader instanceof jdk.internal.loader.ClassLoaders.AppClassLoader(JDK 9+)或sun.misc.Launcher$AppClassLoader(JDK 8)→ 应用类加载器 -
loader instanceof jdk.internal.loader.ClassLoaders.ExtClassLoader或sun.misc.Launcher$ExtClassLoader→ 扩展类加载器
查看当前线程上下文类加载器
有时目标类不是直接通过 Class.forName() 加载,而是由当前线程隐式使用,可检查:
Thread.currentThread().getContextClassLoader()- 该值常被框架(如 Spring、Tomcat)修改,用于加载插件或资源
- 它不一定等于某个类实际的
getClassLoader(),但影响后续Class.forName(String)等行为
调试技巧:增强输出信息
为更清晰识别,可以封装一个工具方法:
static void printClassLoader(Class> clazz) {ClassLoader loader = clazz.getClassLoader();
if (loader == null) {
System.out.println(clazz.getName() + " → Bootstrap ClassLoader");
} else {
System.out.println(clazz.getName() + " → " + loader.getClass().getName());
System.out.println(" Instance: " + loader);
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










