类的加载简介
1.类加载一般分为三大阶段:加载、连接和初始化
加载阶段:主要查找class文件(二进制文件)
连接阶段:可以分为验证、准备、解析三个更为详细的阶段
验证:主要确保class版本、class文件的魔术因子等
准备:为类的静态变量分配内存,并且初始化默认的值
解析:把类中的符号信用转为直接引用
初始化阶段:为类的静态变量赋予正确的初始值。
2.类的主动和被动使用
主动使用(6种):
new 初始化、访问类的静态变量、访问类的静态方法、对某个类进行反射操作、初始化子类导致父类初始化、启动类(main)
被动使用:
除过以上6种都是被动使用(数组new不是主动使用)
3.类的加载过程详解
类的加载阶段:
类的加载简单的说就是把class二进制加载到内存中,然后将该字节流的静态存储结构转为方法区中运行的数据结构,并在堆内存生成唯一的class对象,作为方法区数据结构的入口。
类的加载获取方式:
运行时生成、网络方式获取、服务zip文件获取(jar、war)、将类的二进制数据存储在数据库的BLOB字段类型中、运行时生成class文件,并动态加载
类的连接阶段:
验证:
验证文件格式:魔术因子、主次版本号等
元数据验证:语义分析过程、是否存在父类、是否集成被final修饰的类等
字节码验证:主要验证控制流程
其他验证:通过符号引用描述的字符能够顺利找到相关的类等
准备:
为该对象的静态变量分配内存和初始值。final修饰的是编译阶段javac会将其生成一个ConstantValue属性,直接赋值。
解析:解析阶段也会有一些交叉验证过程,比如符号验证等。
类接口解析、字段解析(某个类包含某个字段,则直接返回这个字段的引用)、类方法的解析(可以直接使用该类调用)、
接口方法解析(必须有相应的实现类继承才能调用、可以定义方法)。
4.类的初始化
这是类的最后一个阶段,这个阶段最主要就是做一件事情,就是执行<clinit>()
方法,在执行时候都会赋予正确的值,也就是编写时候的值。
希望能交流更多技术,关注小白的微信公众号吧。