1. 类加载器的父亲委托机制(双亲委托机制)
- 在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外(根类加载器没有父加载器),其余的类加载器都有且只有一个父加载器
- 当一个加载器加载一个类时,会递归的交给父加载器进行加载。直到递归到最顶层,然后自顶向下进行判断,如果一旦有一个加载器能够成功加载,那么加载成功结束
- 它是自底向上检查类是否以及加载,然后自顶向下尝试加载该类
2. 各个类加载器的加载的类
1. BootStrap ClassLoader (启动类加载器)
- Load JRE\lib\rt.jar 或者-Xbootclasspath 选项指定的jar包
- $JAVA_HOME 中jre/lib/rt.jar 里所有的class,由c++实现,不是ClassLoader子类
2. Extension ClassLoader
- Load JRE\lib\ext\*.jar 或-Djava.ext.dirs 指定目录下的jar包
- 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME 中jre/lib/*.jar 或-Djava.ext.dirs 指定目录下的jar包
3. App ClassLoader
- Load CLASSPATH 或 -Djava.class.path 所指定的目录下的类和jar包
- 负责加载classpath 中指定的jar包及目录中class
- 加载工程项目中的class文件
4. Custom ClassLoader
通过java.lang.ClassLoader 的 子类自定义加载class
在oracle的hotspot虚拟机中 采用的是标准的父亲委托机制,但是在其他虚拟机实现中可能不是
- 若有一个类加载器能够成功加载Test类,那么这个类加载器被称为定义类加载器,所有能成功返回Class对象引用的类加载器(包括定义类加载器)都被称为初始类加载器
3. 加载器分析
- 如果对应的类加载器对应的是启动类加载器,那么返回null