Java ClassLoader 基础

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实现的需要。

Java ClassLoader 基础

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e8e7b6bfc6d384249c3ad14419671823.html