JVM 类加载器 可以分成两类, 一是引导类加载器(C/C++实现),第二种是自定义类加载器(Java实现, 抽象基类ClassLoader)。
这里仅以代码记录自定义类加载器的相关基础 (ClassLoader -> ExtClassLoader 扩展类加载器 -> AppClassLoader 系统类加载器, 都在sun.misc.Launcher.java 中)
public class JavaTestSimple {
public static void main(String args[]) {
try {
//1. 尝试获取JAVA核心类库的 类加载器
Class<?> aClass = Class.forName("java.lang.String");//返回与给定的字符串名称相关联类或接口的Class对象,new是根据加载到内存中的类创建一个实例
System.out.println(aClass); //class java.lang.String
System.out.println(aClass.getClassLoader()); // null
//2. 获取当前类的类加载器
System.out.println(JavaTestSimple.class.getClassLoader());// sun.misc.Launcher$AppClassLoader@4e0e2f2a
// 获取其上层: 扩展类加载器
System.out.println(JavaTestSimple.class.getClassLoader().getParent());//sun.misc.Launcher$ExtClassLoader@2a139a55
// 再获取扩展类加载器的上层:
System.out.println(JavaTestSimple.class.getClassLoader().getParent().getParent());//null
//3. 获取系统类加载器
System.out.println(ClassLoader.getSystemClassLoader());//sun.misc.Launcher$AppClassLoader@4e0e2f2a
//4. 获取当前线程的类加载器
System.out.println(Thread.currentThread().getContextClassLoader());//sun.misc.Launcher$AppClassLoader@4e0e2f2a
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}