Classloader是Java运行时核心机制之一,它解决了我们的.class文件如何被jvm加载的问题。也就是我们的写的源码.java文件被编译成.class字节码后,如何被jvm加载解释。 Java在广义上有三种classloader BootstrapClassLoader 是JVM级别的classloader,使用c/c++来写的。详细解释如何来加载一个bootstrap级别的class文件,哪些class文件是bootstrapclassloader来加载的。 ExtClassLoader 是ExtensionClassLoader,他是AppClassLoader的 ‘父类’,这个父类不是指AppClassLoader extends ExtClassLoader,而是指ExtClassLoader来创建了AppClassloader,后面源码部分可以解释这个关系。 AppClassLoader 这是一般我们自己写的class的classloader,他加载了我们自己写的class,而且同时如果我们有自定义的classloader,那么他也是custom class loader的parent class loader. 他们的加载顺序也是从上往下,即 1->2 ->3。 到这里可能会产生疑问,他们加载的class有何不同? AppClassLoader是上面说的,他会加载我们自己定义的class,即我们workspace的classpath下的class ExtClassLoader则是加载我们Jdk lib/ext 下的class BootstrapClassLoader是加载 rt.jar、resources.jar、charsets.jar和class等。 那么他们是如何找到lib下这些class文件呢? 答案是通过环境变量中的一些变量,而这些变量的定义也是通过我们设置的JAVA HOME等来取得。 源码中有这么两个地方解释了这个地方。 ==》 private static String bootClassPath = System.getProperty( "sun.boot.class.path" ); ==》...