JVM系列(之ClassLoader)

Class Loader

Java运作流程

内部class loader

  • bootstrap class loader --引导类加载器,它负责加载Java的核心类【java.* 】(如classpath下面的类库),不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。Code . URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();  
  • extension classloader -扩展类加载器,它负责加载JRE的扩展目录【javax.* 】(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包。
  • system classloader -系统(也称为应用)类加载器,它负责加载系统或用户实现的类,在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径,如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。ClassLoader.getSystemClassLoader()获取。

ClassLoader加载过程

  classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;委托机制则是先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。

按Loader的应用场景分类

  • 系统class loader
  • 调用者 class loader

  加载当前类,可以是SystemClassLoader,通过getClass().getClassLoader()来得到

  

  Output

  

  • 线程上下文class loader

   每一个线程都有一个关联的上下文ClassLoader.如果使用new Thread()方式生成新的线程,新线程将继承其父线程的上下文ClassLoader.

  

  Output

  

原文地址:https://www.cnblogs.com/mixes/p/4108538.html