类加载器分类
JVM支持两种类型的类加载器,分别为:引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
从概念上讲,自定义加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义加载器。这样扩展类加载器与系统类加载器都属于自定义加载器。
根据代码来体验类加载器之间的关系
package com.zzz.jvm.classloader;
public class ClassLoaderTest {
public static void main(String[] args) {
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//获取其上层,扩展类加载器
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println(extClassLoader);
//获取其上层
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
System.out.println(bootstrapClassLoader);
//对于用户自定义类来说,默认使用系统类加载器
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
System.out.println(classLoader);
//String类的类加载器 使用引导类加载器来加载--->>由此可以推导出系统的核心类库都是由该类加载器加载
ClassLoader stringClassLoader = String.class.getClassLoader();
System.out.println(stringClassLoader);
}
}
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1540e19d
null
sun.misc.Launcher$AppClassLoader@18b4aac2
null
启动类加载器(引导类加载器 Bootstrap ClassLoader)
- 这个类由c++/c语言实现,嵌套在JVM内部。
- 它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resource.jar、sun.boot.class.path路径下的内容),用于提供JVM自身需要的类。
- 不继承自java.lang.ClassLoader,没