Java Classloader(类装载器):JRE的一个模块,用于装载Java类到JVM。
JRE加载一个类到JVM需要以下基本步骤:
装载:查找并导入class文件,如String.class;
链接:校验、准备、解析,其中解析步骤是可以选择的,由使用目的决定;
校验:检查载入class文件数据的正确性,因为某些class文件可能是利用工具生成,而非使用Java编译器编译生成;
准备:给类的静态成员分配存储空间;
解析:将符号引用转成直接引用;
初始化:对类的静态成员、静态代码块执行初始化工作。
JRE自带的的三个ClassLoader:
Bootstrap class loader:用于装载<JAVA_HOME>/jre/lib目录下的Java核心类库,该装载器使用本地代码实现,本身不是Java类。
Extensions class loader:用于装载<JAVA_HOME>/jre/lib/ext目录下的类库,或者java.ext.dirs系统属性指定的目录,具体实现类是sun.misc.Launcher$ExtClassLoader。
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实现的需要。