4.加载器的分类
JVM支持两种类型的类加载器,分别为引导类加载器(BootStrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)
>从概念上来说,自定义类加载器一般指程序中由开发人员自定义的一类类加载器,但是在java规范中并没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分到自定义类加载器中
>无论如何划分,常见的类加载器始终只有三个:
重点:上面类加载器的关系是上层包含层的关系
package jvm;
public class ClassLoaderTest {
public static void main(String[] args) {
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//输出:sun.misc.Launcher$AppClassLoader@18b4aac2,发现其加载器是Launcher的内部类:AppClassLoader
System.out.println(systemClassLoader);
//获取其上层加载器,即扩展类加载器
ClassLoader extClassLoader = systemClassLoader.getParent();
//输出:sun.misc.Launcher$ExtClassLoader@1540e19d,发现其上层加载器是扩展类加载器Launcher内部类ExtClassLoader
System.out.println(extClassLoader);
//获取引导类加载器
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
//输出null
System.out.println(bootstrapClassLoader);
//获取自定义类的加载器
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
//输出:sun.misc.Launcher$AppClassLoader@18b4aac2,对比上述输出得出,自定义类是由系统类加载器进行加载
System.out.println(classLoader);
//String等基本类库的加载
ClassLoader stringClassLoader = String.class.getClassLoader();
//输出null。对比上述得出,string等基本类库的加载是由最上层引导类加载器BootStrap ClassLoader进行加载的
System.out.println(stringClassLoader);
}
}
1.启动类加载器(又称之为引导类加载器BootStrap ClassLoader)
2.扩展类加载器(Extension ClassLoader)
3.应用程序类加载器(系统类加载器,AppClassLoader)
public class ClassLoaderTest1 {
public static void main(String[] args) {
//启动类加载器(引导类加载器)
URL[] urLs = Launcher.getBootstrapClassPath().getURLs();
for (URL url : urLs) {
//打印启动类加载器加载的jar包路径
System.out.println(url.toExternalForm());
}
System.out.println("=========================");
//扩展类加载器
String extDir = System.getProperty("java.ext.dirs");
for (String path : extDir.split(";")) {
//打印扩展类加载器的加载路径
System.out.println(path);
}
}
}
输出:
file:/E:/work/jdk/jre/lib/resources.jar
file:/E:/work/jdk/jre/lib/rt.jar
file:/E:/work/jdk/jre/lib/sunrsasign.jar
file:/E:/work/jdk/jre/lib/jsse.jar
file:/E:/work/jdk/jre/lib/jce.jar
file:/E:/work/jdk/jre/lib/charsets.jar
file:/E:/work/jdk/jre/lib/jfr.jar
file:/E:/work/jdk/jre/classes
=========================
E:\work\jdk\jre\lib\ext
C:\Windows\Sun\Java\lib\ext
用户自定义类加载器
关于CloassLoader
ClassLoader是一个抽象类,所有的类加载器都继承于ClassLoader(不包含启动类加载器)