对于类的加载和类反射的理解
类的加载
总体来说,类加载一共要进行三个阶段
加载:
将java源文件预编译成java.class字节码文件然后加载进内存当中,并且将这些静态数据转换成方法区运行时的数据结构,最后生成一个代表这个类的java.lang.Class对象(有了对象就能够调用类的方法,这也是反射的基础)
链接:将java二进制代码合并到jvm的运行状态的过程
- 验证:对加载的类进行jvm规范验证,确保没有安全问题
- 准备:正式对类变量(static)进行内存分配,设置初始默认值(内存都在方法区进行分配)
- 解析:虚拟机常量池的常量名替换成地址的过程
初始化:
- 执行类构造器clinit()方法的过程。clinit()方法将会把类的所有赋值动作和静态代码块进行合并
- 若发现父类还没有初始化,虚拟机会对父类先进行初始化
- 虚拟机会保证一个类的clinit()方法在多线程环境中被正确的加锁和同步
反射
前面类的加载说过:在加载过程中,你所写的java源代码会经过一系列的过程,最后生成一个java.lang.Class对象,也就是对你的类进行封装成对象的过程。
简单来说,反射就是将你的类封装成对象,然后调用方法的过程。你可以在运行中调用方法,改变属性值等等,这也就是为什么java语言它是动态的