类加载
类加载
类加载过程
java虚拟机中类加载全过程:加载,验证,准备,解析,初始化
加载
加载阶段需要完成三件事:
- 通过一个类的全限定名来获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口
验证
确保Class文件的字节流中包含的信息符合<< java虚拟机规范>>的全部约束条件,保证这些信息被当做代码运行后不会危害虚拟机自身的安全
准备
准备阶段是正式为类中定义的静态变量分配内存并设置类变量初始值的阶段
解析
java虚拟机将常量池内的符号引用替换为直接引用
初始化
在准备阶段,变量已经赋值了,但是只是0值,而在初始化阶段,则会真正按照我们定义的去初始化
初始化包括:类变量的赋值动作和静态语句块,是按照顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,只能赋值,不能访问。
类加载器
把类加载阶段中的“通过一个类的全限定类名来获取描述该类的二进制字节流”这个动作放在java虚拟机外部去实现,便于让应用程序自己去决定如何去加载所需的类,实现这个动作的代码就叫做“类加载器”
双亲委派模型
从java虚拟机角度来看,只存在两种不同的类加载器:
- 一种是启动类加载器,这个类加载器使用c++语言实现,是java虚拟机自身的一部分
- 另外一种就是其他所有的类加载器,这些类加载器都由java语言实现,独立存在于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader
三层类加载器
- 启动类加载器:负责加载存放在<JAVA_HOME>\lib目录,或者被-Xbootclasspath参数所指定的路径下所存放的,并且能够被java虚拟机所识别的类库
- 扩展类加载器:负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所指定的路径中所有的类库
- 应用程序类加载器:负责加载用户类路径上所有的类库
双亲委派模型
工作流程
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给自己的父类加载器去完成,每一个层次的类加载器都是这样的,因此所有的类加载请求都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求,子加载器才会尝试自己去完成加载
好处
保证了类在程序的各种类加载器环境下都能保证是同一个类
破坏双亲委派模型
- 自定义类加载器,重写loadClass()
- 使用线程上下文类加载器
本文为学习笔记,参考资料比较多,所以无法附上全部链接,若个别篇幅涉及侵权,请及时与本人联系,删除或附加链接.

浙公网安备 33010602011771号