类加载器委托机制

public class ClassLoadTest {
 /* 知识储备 */
 /*
  * 类加载器 类加载器是在类未开始时进行CLASS的加载
  * 其中包括BootStrap(核心,由C++编写的2进制编码,是开启类加载器的类)JRE/lib/rt.jar
  * ExtClassLoader,AppClassLoader其中Ext为App的父类 Ext主要是加载jre下的jar文件
  * 其中App加载Classpath下的类
  * Ext加载JRE/LIB/EXT/*.JAR
  * BootStrap 加载 JRE/LIB/rt.jar
  */
 /*
  * 类加载器的原理,还有类加载器的树形结构
  *
  * 委托加载机制,调用子类时找父加载器app子层要找但是不找而是先找父类加载器, 没有父类,开始找自己有么,没有加载成功将下放在下级
  */

 // 模板方法设计模式,总体流程在父类中规定好,在细节上留一个抽象方法
 // ClassLoader classLoader = new ClassLoader()

 /*
  * 一下为类加载器的测试方法 1.测试类加载器名称
  */
 public static void main(String[] args) {
  // 输出ClassLoadTest类的类加载器名称
//  System.out.println(ClassLoadTest.class.getClassLoader().getClass()
//    .getName());
  //获取系统类的类加载器
//  System.out.println(System.class.getClassLoader());
  
  /* 将此类打包成JAR包放入到jre/ext的目录下,此类在运行时就将在EXT目录先进行加载,app加载器将不
   * 再加载此类。
   * 得到结论(委托机制,统一管理):
   * 从最低层发出请求,推到最顶层(开始找,没有找到就向下级找)
   * BootStrap -->  Ext  -->  App  (父-->子)
   * 请求流向(但并没有开始找)   App --> Ext --> Boot (开始查找,找到后进行加载没有继续向下) --> Ext -- App
   * */
  ClassLoader classLoader = ClassLoadTest.class.getClassLoader();
  
  while(classLoader != null){
   System.out.println(classLoader.getClass().getName());
   classLoader = classLoader.getParent();
  }
  System.out.println(classLoader);
  System.out.println(new ForClassLoad());
 }
}

你可能感兴趣的:(java,类加载器,深度,委托机制)