我看了一圈"深入class文件结构"这一章,我发现我很懵逼,于是我打算跳过它,直接开始看ClassLoaser,类加载器。之前讲到了,我们写好的java文件会被编译成class文件,那么Java要想运行这个文件,一定要使用某个工具放到Java virtual machine (Java 虚拟机)里面去运行,这也是为什么Java 可以跨平台的原因,因为无论你在什么设备上想用Java势必要装上虚拟机才可以运行。就好像之前我所使用的Unity引擎,也是具备跨平台的特点,原理几乎一样,它可以运行在Web、Android、Linux、Windows操作系统上,就是需要安装Unity插件,运行在该插件上即可。
ClassLoader 加载一个class 文件到JVM时需要经过的步骤:
- 找到.class 文件并把这个文件包含的字节码加载到内存中。
- 字节码验证->Class类数据结构分析及相应的内存分配和最后的符号表的链接。
- 静态属性和初始化赋值,以及静态块的执行。
1.加载字节码到内存
用 URLClassLoader 找到这个 class 文件,读取它的byte字节流,通过 defineClass()方法来创建类对象。判断是jar 包还是文件,分别创建 FileLoader 或者 JarLoader ,或者使用默认的加载器。调用 findClass 加载字节流到内存中。
2.验证与解析
- 字节码验证
- 类准备,准备方法、字段和实现的接口
- 解析,装入所引用的其他类
3.初始化 Class 对象
在类中包含的静态初始化器都被执行,在这一阶段末尾静态字段被初始化为默认值。