ClassLoader(类加载器)
Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader
负责将这些class
文件给加载到JVM中去执行。
JVM中提供了三层的ClassLoader:
- BootstrapClassLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和AppClassLoader。
- ExtClassLoader:主要负责加载
jre/lib/ext
目录下的扩展的jar。 - AppClassLoader:主要负责加载应用程序的主函数类。
双亲委派机制
首先会在AppClassLoader
中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass
方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader
之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader
,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException
。