首先,我们来简单的回顾下类加载机制中的内容。
类加载机制
虚拟机把类的数据从.class文件加载到内存,并对class文件中的数据进行校验、转换、解析、初始化等操作后,最终形成可以被虚拟机识别并使用的Class对象的过程就叫做“虚拟机的类加载”,主要包括为3大阶段。
阶段一:加载
加载,类加载器通过类的全限定名来获取类的二进制字节流,获取的方式可以通过jar包、war包、网络、JSP文件中获取,绝大部分情况下是通过jar包、war包中获取。
获取到字节流后,会将字节流中的信息转化为方法区中的运行时数据结构。在内存中,生成代表该类的Class对象,作为访问该类的数据入口。
阶段二:连接
连接比较复杂,分为3个小阶段:
验证:确保被加载类的正确性,即确保被加载的类符合javac编译的规范,可编译通过的代码。
准备:为类的静态变量分配内存,并初始化为默认值(零值)。
解析:将类中的符号引用转化为直接引用。
阶段三:初始化
为类的静态变量赋值,与连接阶段中的的准备不同。此阶段,代码可debug查看。
如int类型的静态变量static int x = 3,连接阶段赋零值即为0,而初始化阶段赋值即为3。
以上就是类加载机制的三大阶段,而我们今天要将的类加载器存在于阶段一中--加载。可以说,没有类加载器也就没有了后续的流程,类加载器在Java虚拟机中起到了至关重要的作用。
类加载器
类加载器(class loader)将Java类从本地磁盘加载到Java虚拟机中,并同时创建了该类的Class对象,实现了“通过一个类的全限定类名来获取此类的二进制字节流”功能。
类加载器是Java语言的一项创新,也是Java语言流程的重要原因之一,在类层次划分、OSGI、热部署、代码加密等领域有着重要的作用,成为Java不可或缺的一部分。
首先,我们来写一个测试类,来看下类加载器,ClassLoaderTest测试类: