基本概念:

Java Classloader(类装载器):JRE的一个模块,用于装载Java类到JVM。


JRE加载一个类到JVM需要以下基本步骤:

  1. 装载:查找并导入class文件,如String.class; 

  2. 链接:校验、准备、解析,其中解析步骤是可以选择的,由使用目的决定; 

  3. 校验:检查载入class文件数据的正确性,因为某些class文件可能是利用工具生成,而非使用Java编译器编译生成; 

  4. 准备:给类的静态成员分配存储空间; 

  5. 解析:将符号引用转成直接引用; 

  6. 初始化:对类的静态成员、静态代码块执行初始化工作。


JRE自带的的三个ClassLoader:

  1. Bootstrap class loader:用于装载<JAVA_HOME>/jre/lib目录下的Java核心类库,该装载器使用本地代码实现,本身不是Java类。

  2. Extensions class loader:用于装载<JAVA_HOME>/jre/lib/ext目录下的类库,或者java.ext.dirs系统属性指定的目录,具体实现类是sun.misc.Launcher$ExtClassLoader。

  3. System class loader:用于装载应用CLASSPATH路径指定的类与资源(如配置文件等),具体实现类是sun.misc.Launcher$AppClassLoader,所以也常称为App class loader。


为什么需要三个class loader?这三个class loader又是如何分工了?这年代靠拼爹,需要任何东西尽管先向爹要,爹没有再自己拼,下图中100万比喻为请求的类,天一为System class loader,天一爸爸为Extensions class loader,天一爷爷为BootStrap class loader,查看保险箱相当于load class,通过这个形象的比喻可以简单的理解class loader代理关系,以及单一职责链模式。JRE提供三个class loader主要是为了分工以及JVM实现的需要。

wKioL1RrNofQy5W8AALl3ik0_QY582.jpg