类装载器的作用就是将编译后的字节码文件(.class)装入JVM(生成.class文件在内部的组件)。
其工作过程:
1.装载阶段:查找目标文件(.class),并导入该文件。
2.链接阶段:首先验证字节码文件的正确性;校验通过后为静态变量分配内存空间;符号引用解析为直接引用
(注解:符号引用为被调用类的类名,直接引用就是类的内存地址)
3.初始化:初始化静态变量、块。
装载阶段的工作由ClassLoader(运行时系统组件)及其子类完成。
虚拟机在运行时产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)
这三者存在层次关系,根装载器是扩展装载器的父类,扩展装载器是系统装载器的父类,这里需要注意的是根装载器是由C++写的,在java中看不到他。
其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载Classpath路径下的类包。
此外可由ClassLoader中getParent()方法来查看当前装载器的父类,如果父类为根装载器,返回的结果是 null值。
下面介绍JVM装载类的机制:
JVM采用“全盘负责委托机制”,其中 全盘负责 就是一个ClassLoader装载一个类时不仅装载该类同时装载该类的的依赖和引用(除非你显示的使用另外一个ClassLoader来装载)。委托机制 就是 先委托父类装载器来寻找目标类并完成装载工作,如果父类寻找失败,才由当前装载器在自己的类路径寻找目标类并完成装载工作。这么做可以防止出现这样的情况 (有人编写了一个恶意的基础类(如java.lang.String)并装载到JVM中)。