关于反射,及JVM是如何实现类加载

   最近去了解反射,在过程中我产生了一些疑问就是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:有不对的地方,望发言讨论

 

猜你喜欢

转载自blog.csdn.net/weixin_40840879/article/details/80090986