Java:class8 类加载,链接,初始化三大阶段

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43336822/article/details/95599883

一、加载
1.java文件被编译成class字节码文件,字节码文件被类加载器从磁盘加载到内存上。

2.魔数标志着文件的类型

3.系统提供的类加载器:

①Boostrap ClassLoader:启动类加载器,主要加载jre/lib/re.jar,该目录下的所有jar包都是运行JVM时所必需的jar包。p.s.类加载器其实自身也是一个JAVA类,因此,自身类加载器需要被其他类加载器进行加载后方可使用,显然必需有一个类加载器的顶级父类(也就是BootstrapClassLoader,该类加载器是由C开发的。)是其他类加载器的父类。所以,如果一个类的类加载器是BootstrapClassLoader,那么该类的getClassLoader()方法返回null.

②Extension ClassLoader (Ext ClassLoader):扩展类加载器,主要加载JAVA核心扩展类,即jre/lib/ext目录下的jar文件。

③ApplicationClassLoader (AppClassLoader):应用类加载器,主要加载的是开发者在应用程序中编写的类,即CLASSPATH路径下的所有jar文件。

4.双亲委派模型的工作过程如下:
(1)当前类加载器从自己已经加载的类中查询是否此类已经加载,如果已经加载则返回原来已经加载的类。
(2)如果没有找到,就去委托父类加载器去加载。父类加载器也会采用同样的策略,查看自己已经加载过的类中是否包含这个类,有就返回,没有就委托其父类去加载,直到委托到启动类加载器为止。因为如果父类加载器为空了,就代表使用启动类加载器作为父加载器去加载该类。(也就是看到的 String 类加载器为 null)
(3)如果启动类加载器加载失败,就会使用扩展类加载器来尝试加载,继续失败则会使用 AppClassLoader 来加载,继续失败就会抛出一个异常 ClassNotFoundException。

5.使用双亲委派模型的好处:
(1)安全性,避免用户自己编写的类动态替换 Java 的一些核心类。如果不采用双亲委派模型的加载方式进行 类的加载工作,那我们就可以随时使用自定义的类来动态替代 Java 核心 API 中定义的类。例如:如果黑客将“病毒 代码”植入到自定义的 String 类当中,随后类加载器将自定义的 String 类加载到 JVM 上,那么此时就会对 JVM 产生 意想不到“病毒攻击”。而双亲委派的这种加载方式就可以避免这种情况,因为 String 类已经在启动时就被引导类 加载器进行了加载。
(2)避免类的重复加载,因为 JVM 判定两个类是否是同一个类,不仅仅根据类名是否相同进行判定,还需要 判断加载该类的类加载器是否是同一个类加载器,相同的 class 文件被不同的类加载器加载得到的结果就是两个不 同的类。

5.两个类是否相等,两个类的类加载器相同是前提。

二、链接阶段
(1)验证:当前字节码文件是否符合虚拟机要求(魔数,版本号……)
(2)准备:给类变量在方法区中开辟内存,赋类型的初始值
(3)解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

三、初始化
给类变量赋值操作

猜你喜欢

转载自blog.csdn.net/qq_43336822/article/details/95599883