当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构,并依次调用,它们是:
- bootstrap classloader
- extension classloader (ExtClassLoader)
- system classloader (AppClassLoader)
bootstrap classloader:引导类加载器。负责加载Java核心类。它不是Java.lang.ClassLoader的子类,而是由
JVM自身实现的(故而调用getClassLoader()方法将返回null);
extension classloader:扩展类加载器。负责加载JRE扩展目录中的JAR类包;
system classloader:系统类加载器。负责JVM启动时加载系统中的JAR类包(从classpath中)。
classloader加载类用的是全盘负责委托机制。全盘负责是指当一个classloader加载一个class的时候,该class
所依赖和引用的所有class也由这个classloader载入,除非显式地使用另一个classloader;委托机制是指先令父
加载器寻找类,只有在找不到的时候才从自己的类路径中去寻找。这一点是从安全角度考虑的,试想如果有人编写
了恶意的类,如java.lang.String,这是个系统核心类,那么加载到你就倒霉了。但是由于有了全盘负责制,
java.lang.String永远是由bootstrap classloader 来加载的,这样就避免了上述事件的发生。
若加载器不能载入某个class时(如拼写错误或未放到classpath中),则抛出“cannot resolve symbol”错误。