ClassLoader的工作机制

1、ClassLoader的等级加载机制----上级委托接待机制

类加载器在加载一个类时,首先会判断是否已经加载过这个类了,如果已经加载过,则拒绝加载;如果没有加载过,则会向上一级的类加载器询问是否加载过,上一级根据自己的规则,检查这个会员是否被接待过,如果接待过,拒绝,并将结果向下反馈,如果没有接待过,继续向上级询问。如果上级都没有加载过,并且也不应该由上级加载,则由最初的类加载器加载这个类。

2、ClassLoader的类型

----Bootstrap ClassLoader:加载JVM自身工作需要的类,完全由JVM自身控制,所以这个类不遵守上级委托接待机制的规则,它既没有更高一级的父加载器,也没有子加载器。

----ExtClassLoader:属JVM自身的一部分,但并不由JVM亲自实现,它服务的特定目标在System.getProperty(“java.ext.dirs”)目录下。

----AppClassLoader:专门加载类的,是ExtClassLoader的子类。所有在System.getProperty(“java.class.path”)都可以被这个类加载。

3、加载方式

----隐式加载:不通过在代码里调用ClassLoader来加载需要的类,而是通过JVM来自动加载需要的类到内存的方式,如继承或引用的类;

----显式加载:在代码中通过调用ClassLoader来加载需要的类。

4、如何加载class文件

----找到class文件并将文件包含的字节码加载到内存中;

----字节码验证、Class类数据结构分析及相应的内存分析和最后的符号表的链接。

----类中静态属性和初始化赋值,以及静态块的执行等。

5、实现自己的ClassLoader
ClassLoader的工作机制

ClassLoader的工作机制
6、实现类的热部署

JVM表示一个类是否是同一个类有两个条件。一是看这个类的完整类名是否一致,这个类名包括类所在的包名;而是看加载这个类的ClassLoader是否是同一个实例。即使是同一个ClassLoader的两个实例,加载同一个类也会不一样,所以要实现类的热部署可以创建不同的ClassLoader的实例对象。