JVM:类加载过程
JVM数据把class文件加载到内存,并对数据进行验证,解析,初始化,最终形成JVM可以直接使用的java类型的过程
- 加载
加载指的是指通过类加载器将类的class文件读入到方法区形成类的信息(属性,方法,构造器的二进制数据),并在堆内存为之创建一个java.lang.Class反射对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象(说明反射类是个泛型类)。可以通过该反射对象去方法区获取类的信息(属性,方法,构造器的二进制数据)。
1.通过“类全名”来获取定义此类的二进制字节流
2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构
3.在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
- 链接
当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。
- 初始化
初始化是执行类构造器 clinit()方法的过程,由编译器自动执行
以语句A a=new A()的过程为例说明:
- 首先会在栈中创建一个a,并初始化为null
- clinit()方法通过java.lang.Class去方法区获取类的信息,并在堆中创建对象a,并初始化,并返回a的引用地址到栈中的a
- 类的主动引用 (一定会发生类的初始化)
- new一个类的对象
- 调用类的静态成员和静态方法
- 使用反射对类进行调用
- 初始化一个类,会先初始化他的父类
- 类的被动引用(不会发生类的初始化)
- 通过子类调用父类的静态属性时,子类不会初始化
- 调用final常量不会初始化类,常量存于常量池中