本文内容主要来源于《分布式java应用与基础实践》
类加载机制
类加载机制是指.class文件加载到jvm生成class对象,然后在代码中可以实例化class对象并进行调用。类加载机制不仅可以加载本地的.class还可以运行时动态加载.class ,并且通过类加载机制达到类隔离的效果。比如tomcat中可以部署多个war包就是通过类隔离机制来实现的。
整个类加载过程分为三个步骤:
- 加载
- 链接
- 初始化
当加载和链接过程完成后,.class文件就从二进制文件转化为了Class对象 ,但是初始化不一定发生在类加载过程中,但是最迟发生在初次主动使用对象前。

装载
装载过程负责将二进制字节码加载到jvm中,通过类的全限定名和类加载器完成类的加载,并且使用类的全限定名和类加载器实例id来标识被加载的类:com.test.Demo+ClassLoader实例id。类的命名规范如下:
- 对于接口或非数组类型的类,其名称即为类名
- 对于数组类型的类,其名称为“[+基本类型或L+引用类型类名;“,数组类型中的元素类型由所在的classLoader负责加载,但是数组类型本身则由jvm直接创建。
链接
该过程主要是对二进制字节码进行校验,初始化静态变量以及设置默认值,解析类调用的接口和类,对类中属性和方法进行验证。
初始化
初始化过程包括:执行静态代码块,构造器,静态属性的初始化。在以下四中情况下会进行初始化操作:
- new一个对象。
- 反射调用了类中的方法。
- 子类初始化
- jvm启动过程指定的初始化类。
类加载机制
从JDK1.2版本开始引入如下图所示的双亲委派模型。什么叫双亲委派模型:除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。具体工作过程:如果一个类加载器收到类加载请求,它首先会将请求动作委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传递到顶层的启动类加载器中,只有当父类加载器反馈自己无法加载请求时(在它的搜索范围内没有找到所需的类),子加载器才会尝试自己去加载。

-
BootStrap ClassLoader
此类是由C++实现的,属于虚拟机自身的一部分。这个类不是ClassLoader的子类,在运行时没办法拿到这个对象,jvm启动时会初始化此类,并且通过此ClassLoader完成$JAVA_HOME中的jre/lib/rt.jar里面所有的class文件。 -
Extension ClassLoader
jvm用此ClassLoader来加载一些拓展的jar包,对应的类名为:ExtClassLoader。 -
System ClassLoader
jvm用此ClassLoader来加载启动时指定的Classpath中的jar包,对应的类名为:AppClassLoader。 -
User-defined ClassLoader
开发人员集成ClassLoader抽象类自行实现类加载器。可以在类加载时自定义操作,比如从网络下载jar包,解密等等。
网友评论