当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:
bootstrap classloader
|
extension classloader
|
system classloader
- bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类。
- extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包。
- system classloader -系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。
1. classloader 加载类用的是全盘负责委托机制。
1) 所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个
classloader负责载入(除非是显式的使用另外一个classloader载入):
-->放在jre的ext目录下的jar包加载优先级最高系统启动的时候它先从jre目录里找到了这个类,因为这个类又引用了
log4j的类,它就接着在jre的classpath里找,没找到 所以报异常了。
2) 委托机制:先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在
parent找不到的时候才从自己的类路径中去寻找。
2. 此外,类加载还采用了cache机制,就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转
换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。
3. 最后,由同一个类加载器所加载的类只能引用该加载器和其父加载器所加载的其他类。
类加载顺序:
jvm先在核心类库里找需要的类,
若没有就去jre的ext下的.jar中找,
然后是当前路径,最后才在classpath里找。