前言
上一节(1) 类加载之流程理解记录了类加载过程中五个具体步骤的流程理解。那么对于一个需要加载的类,到底是什么东西来对它进行加载呢?
其实在程序启动之初,在加载包括核心类库在内的所有类库之前,JVM会先创建一个用C++实现的引导类加载器实例,然后用这个类加载器加载JVM启动器类"sum.misc.Launcher"并跨语言调用JAVA代码来创建实例,通过该实例调用"sum.misc.Launcher.getLauncher()"方法来初始化扩展类加载器和应用程序类加载器。上一节已经贴过流程图,在这里再次放上:
一、JVM的四种类加载器
1、引导类加载器
运行以下代码:
package com.jim.jvm.classload;
import sun.misc.Launcher;
import java.net.URL;
import java.util.List;
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println("加载List类的类加载器:" + List.class.getClassLoader());
System.out.println();
System.out.println("引导类加载器 加载以下文件:");
URL[] urls = Launcher.getBootstrapClassPath().getURLs();
for (URL url : urls) {
System.out.println(url);
}
}
}
得到结果如下:
加载List类的类加载器:null
引导类加载器 加载以下文件:
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/resources.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/rt.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/sunrsasign.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/jsse.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/jce.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/charsets.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0_131/jre/lib/jfr.jar
file:/E:/Program%20Files%20(x86)/java/jdk1.8.0</