面试知识点学习4——反射机制、类加载时的内存布局

4 反射机制、类加载时的内存布局 4.1 学习资料——B站韩顺平 【韩顺平讲Java】Java反射专题 -反射 反射机制 类加载 reflection Class 类结构 等_哔哩哔哩_bilibili
4.2 静态加载/动态加载

  • 静态加载:编译时加载相关的类,如果没有则报错,依赖性强
  • 动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类也不报错,降低了依赖性。
面试知识点学习4——反射机制、类加载时的内存布局
文章图片

? 反射是动态加载,编译时不会报错,只有当代码执行到相应的代码时才会报错
4.3 类加载时机(只有反射是动态加载) 面试知识点学习4——反射机制、类加载时的内存布局
文章图片

4.4 类加载过程 面试知识点学习4——反射机制、类加载时的内存布局
文章图片

面试知识点学习4——反射机制、类加载时的内存布局
文章图片

4.4.1 加载
将字节码从不同的数据源(可能是class文件,也可能是jar包,甚至是网络)转化为二进制字节流加载到内存中(方法区中),并生成一个代表该类的java.lang.Class对象。
4.4.2 连接—验证
面试知识点学习4——反射机制、类加载时的内存布局
文章图片

4.4.3 连接—准备
==静态变量==分配内存(方法区中分配),默认初始化(不管给什么值,先按照对应的数据类型的默认值初始化,如0、0L、null、false等);
准备阶段代码示例:(n2在初始化时赋值为20)
面试知识点学习4——反射机制、类加载时的内存布局
文章图片

4.4.4 连接—解析
虚拟机把常量池中的符号引用替换成直接引用;
假设A类引用B类,编译时使用的符号来引用,比如1引用2;解析后有内存地址,变成了A的地址引用B的地址。
4.4.5 初始化
显式(指定)初始化,程序员可控制;
面试知识点学习4——反射机制、类加载时的内存布局
文章图片

代码示例:
面试知识点学习4——反射机制、类加载时的内存布局
文章图片

面试知识点学习4——反射机制、类加载时的内存布局
文章图片

分析:
  • 1.加载B类,生成B的Class对象;
  • 2.链接:num=0;
  • 3.初始化:依次收集类中所有静态变量的赋值动作和静态代码块中的语句:
    clinit(){ System.out.println(“B静态代码块被执行”); num=300; num=100; } 进行合并:num=100

补充:
如果main函数是这样的:
public static void main(String[] args) { System.out.println(B.num); }

此时直接使用类的静态属性,则不执行构造器方法,也会有类的加载,输出为:
B静态代码块被执行 100

如果main函数是这样的:
public static void main(String[] args) { new B(); System.out.println(B.num); }

【面试知识点学习4——反射机制、类加载时的内存布局】输出为:
B() 构造器被执行 B静态代码块被执行 100

    推荐阅读