对于类的加载和类反射的理解

类的加载

总体来说,类加载一共要进行三个阶段

加载:
将java源文件预编译成java.class字节码文件然后加载进内存当中,并且将这些静态数据转换成方法区运行时的数据结构,最后生成一个代表这个类的java.lang.Class对象(有了对象就能够调用类的方法,这也是反射的基础)

链接:将java二进制代码合并到jvm的运行状态的过程

  1. 验证:对加载的类进行jvm规范验证,确保没有安全问题
  2. 准备:正式对类变量(static)进行内存分配,设置初始默认值(内存都在方法区进行分配)
  3. 解析:虚拟机常量池的常量名替换成地址的过程

初始化:

  1. 执行类构造器clinit()方法的过程。clinit()方法将会把类的所有赋值动作和静态代码块进行合并
  2. 若发现父类还没有初始化,虚拟机会对父类先进行初始化
  3. 虚拟机会保证一个类的clinit()方法在多线程环境中被正确的加锁和同步

反射

前面类的加载说过:在加载过程中,你所写的java源代码会经过一系列的过程,最后生成一个java.lang.Class对象,也就是对你的类进行封装成对象的过程。

简单来说,反射就是将你的类封装成对象,然后调用方法的过程。你可以在运行中调用方法,改变属性值等等,这也就是为什么java语言它是动态的

参考遇见狂神说的注解与反射p9

posted @ 2021-12-19 10:22  小罗要有出息  阅读(37)  评论(0编辑  收藏  举报