最近去了解反射,在过程中我产生了一些疑问就是JVM是如何加载类,并且顺序是怎么样,然后现在就总结一下 自己所了解的。
首先JVM装载类分三个环节:
1. 加载将编译后产生的class文件以二进制流加载到JVM方法区中,并在堆中构建该类对应的 Class对象实例
2. 连接(在方法区 类的静态变量和对象开辟内存设置初始值,常量符号引用转化成直接引用等,还有判断是否java规范)
3. 初始化类,在堆中的目标对象对应的class对象实例这时候<clinit>这个类构造器会收集所有静态变量赋值和静态代码块,然后执行它们。
加载类的class文件到内存,JVM好像没有严格的规范,而hotspot是表明初始化才加载,
初始化的时期
1. 创建实例的时候(new , 反射 ,克隆,Java的反序列化)
2. 调用类的静态变量和方法
3. 子类的初始化
4 被JVM标记(main方法)
以下是类是否初始化,静态代码块是否执行的代码测试
不初始化:
Class a = Class.forName("A",false
,ClassLoader.getSystemClassLoader());
结果静态代码块不执行,改为true,即初始化则执行
关于反射,反射其实就是根据全限类名动态加载java对象,是框架例如Spring 选择XML配置加载javaBean时候的实现原理。
ps:有不对的地方,望发言讨论