类加载机制
加载—> 连接 ----> 初始化 ----> 运行 ----> 卸载
连接分为:验证、准备、解析
Java动态扩展语言特性依赖于运行时期加载和动态连接
加载:三部分
1.通过全限定名来获取二进制字节流
2.通过二进制流来将静态存储结构转换为方法区运行时数据结构
3.在内存中生成一个类,作为方法区的各种类数据接口
验证:
1.文件格式验证
2.元数据验证
3.字节码验证
4.符号引用验证
准备:加载static修饰的数据或者方法
解析:将常量池的符号引用变化为直接引用
加载和连接并不是按部就班的完成和开始,但是结束的时间和顺序可不一定按顺序的,当jvm需要访问一个文件时,此时会进行加载阶段。将文件转换为二进制字节码,在转换为二进制字节码和转换运行时期的方法区中间需要用到连接中的验证,来验证文件格式是否正确。文件格式正确则会验证元数据、字节码、符号。如果验证通过后,则会接着往下进行,在加载阶段转换为运行时期的方法区,还需要进行来连接和时的准备来先加载static修饰的数据,然后加载才会运行转换为运行时期的方法区,然后就解析,最后就是生成.class对象作为访问的入口。
类加载器:
1.启动类加载器
2.扩展类加载器
3.应用程序加载器
4.自定义加载器
双亲委派模型:一个类加载器收到了类加载请求,先委派给父类,直到加载到启动类加载器顶级父类,如果此时父类没有方法则会下放给子类运行。如果自定义类与一个系统自带的类重名,则会显示编译通过但是不会加载运行,主要时由于双亲委派模型。
规定必须初始化的阶段
1.反射
2.创建对象new
3.如果子类继承父类,则必须先初始化父类
4.需要执行的主类
5.句柄