可通过getClassLoader()获取类加载器并判断类型:null表示Bootstrap(如String.class)或基本类型;PlatformClassLoader加载平台模块类;AppClassLoader加载应用类;自定义类加载器需检查其类名。

可以通过调用类对象的 getClassLoader() 方法获取其对应的类加载器,再通过打印或判断该加载器的类型来确认由哪个类加载器加载。
获取并识别类加载器
每个 Class 对象都关联一个类加载器,可通过 getClassLoader() 获取。注意:数组类、基本类型(如 int.class)和 void.class 返回 null;而启动类加载器(Bootstrap ClassLoader)在 Java 层也表现为 null。
-
String.class.getClassLoader()→ 返回null(由 Bootstrap 加载) -
ArrayList.class.getClassLoader()→ 通常返回AppClassLoader或PlatformClassLoader(JDK 9+) -
MyClass.class.getClassLoader()→ 一般返回AppClassLoader(即sun.misc.Launcher$AppClassLoader或jdk.internal.loader.ClassLoaders$AppClassLoader)
区分常见类加载器类型
Java 9+ 使用模块化系统,类加载器结构有所变化:Bootstrap → Platform(原 Extension)→ App。可通过 instanceof 或类名判断:
-
cl == null:很可能是 Bootstrap 加载(如java.lang.Object) -
cl instanceof jdk.internal.loader.ClassLoaders$PlatformClassLoader:平台类(如java.sql.*模块类) -
cl instanceof jdk.internal.loader.ClassLoaders$AppClassLoader:应用类路径(classpath)下的类 - 自定义类加载器:通常是用户继承
ClassLoader的子类,可检查cl.getClass().getName()
实用代码示例
下面是一段可直接运行的诊断代码:
public class ClassLoaderInspector {
public static void main(String[] args) {
printLoader(String.class); // null → Bootstrap
printLoader(ArrayList.class); // Platform or App, depending on JDK
printLoader(ClassLoaderInspector.class); // AppClassLoader
printLoader(int.class); // null → 基本类型,无加载器
}
static void printLoader(Class> clazz) {
ClassLoader loader = clazz.getClassLoader();
String name = (loader == null) ? "Bootstrap" : loader.getClass().getSimpleName();
System.out.printf("%-25s → %s%n", clazz.getName(), name);
}
}
注意事项
类加载器归属取决于**实际加载该类的那个加载器**,不是定义位置或包名。例如:
- 即使你的类在
java.util包下,也不会被 Bootstrap 加载——它仍由 AppClassLoader 加载(除非你主动用 Bootstrap 去 load,但通常不可行) - 同一类名若被不同类加载器加载(如 Web 容器中),会视为不同类,不能互相赋值
- JDK 9+ 中
ExtensionClassLoader已被PlatformClassLoader替代,sun.misc.Launcher相关类已不推荐使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











