小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Java 官方的介绍
对于反射,Java在官方文档中有介绍,具体链接是docs.oracle.com/javase/8/do…
下面的三张图有大概介绍反射的流程。
- 反射调用会进行一系列的安全性校验
- 反射需要调用一系列的native方法来实现
- 寻找Class字节码的过程,比如通过ClassName找到对应的字 节码Class,然后进行加载、解析,也会比较慢,而new的方 式则无需寻找,因为在Linking的解析阶段已经将符号引用 转为了直接引用
- 入参校验
类的加载机制
如下图所示: 类装载的三部曲,包括加载、连接、初始化 加载
加载.class文件,主要有以下几个途径:
- 从本地的文件系统中加载 • 通过网络下载
- 从zip.jar包加载.class文件
- 从存储中间件中加载(数据库、缓存…)
- 在JVM运行期间通过动态字节码重组的方式 (ASM)
连接
连接就是将已经读入到内存的类的二进制数据合并到JVM 的运行时环境中,连接过程主要有三个阶段,包括:
- 类的验证,对类的文件进行检查(版本号、模数)以保 证.class符合JVM规范
- 类的准备,分配常量池空间,解析常量池,静态变量的分 配,但不会初始化,只会给默认值
- 类的解析,解析父类,解析接口,解析Filed,解析方法列 表(包含栈、字节码表、异常表、局部变量表、运行指 针),把类二进制的符号引用转变为直接引用