JAVA类加载的涉及
ClassNotFoundException
- 这个异常,它实质涉及到了java技术体系中的类加载。
类加载过程
- 一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段,JVM将类加载过程分为:
加载 ->链接(验证+准备+解析)->初始化(使用前的准备) ->使用 ->卸载
- 加载
首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行的数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。
- 链接
1.验证:确保被加载类的正确性
2.准备:为类的静态变量分配内存,并将其初始化为默认值
3.解析:吧类中的符号引用转换为直接引用
- 类的初始化
- 类什么时候才被初始化
1. 创建类的实例,也就是new一个对象
2. 访问某个类或接口的静态变量,或者对该静态变量赋值
3. 调用类的静态方法
4. 反射(Class.forName(“com.lyj.load”))
5. 初始化一个类的子类(首先会初始化子类的父类)
6. JVM启动时标明的启动类,即文件名和类名相同的那个类- 类的初始化顺序
1. 如果这个类还没有被加载和链接,那先进行加载链接
2. 加入这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载过程中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
3. 加入类中存在初始化语句(static变量和static代码块),那就依次执行哲学初始化语句
4. 总的来说,初始化顺序:
静态变量,静态初始化代码块 ->变量,初始化 -> 构造器;
倘若有父类,顺序为:父类static方法 - > 子类static方法 ->父类构造方法 -> 子类构造方法
- 类的加载
类的加载是指将类的.class文件中二进制数据读取到内存中,将其放在运行时数据区的方法区内1,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象