之前盖房子,是只需要亲朋好友帮忙就可以修建一个新房子
现今,如果要修建一个房子,首先是需要,需要请一个工程师出一个设计方案(加载),然后去相关部门报备,经过验证之后方可准备材料去修建(准备),准备好材料之后按需所放(解析),修建好之后需要装修(初始化)之后方可入住(使用)。
Java虚拟机也和其类似:
类加载一般分为三个大的过程:加载,链接,初始化;
Java语言分为两大类:基本类型和引用类型(类,接口,数组类);
数组类由java虚拟机自动生成,其他类有其对应的字节流。
字节流,最常见的字节流为.class文件,这些字节流都会把被加载到java虚拟机中,成为类或者接口,可以统称为类;
无论是数组类还是java虚拟机生成的类,及加载.class文件生成的类,都需要进行链接和初始化。
加载
加载指查找字节流,并且根据此创建类的过程,前面提到,对于数组类来说(类信息是加载进去的),没有对应的字节流,而是由java虚拟机直接生成;而对于其他类来说,就需要借助类加载器来完成查找字节流的过程。
上文所提到的工程师有着共同的师傅:叫做启动类加载器(boot class loader),启动类加载器是由c++实现的
除了启动类加载器之外,其他的类加载器都是java.lang.ClassLoader的子类,因此有对应的Java对象,这些类加载器首先都需要先由另一个类加载器,比如说启动类加载器,加载至java虚拟机,方可开始类加载。
这些建筑师都有一个规则,就是自己接到的活不能中着手立马去干,需要先交给自己的师傅,师傅不接手的情况下,自己方可着手去做,这种规则称为双亲委派模型,当每一个类加载器接收到加载的请求时,他会先将请求转发给父类加载器。在父类没有找到所请求类的情况下,该类加载器方可去加载。比如Object类在程序的各种类加载环境中都是同一个类。
java虚拟机,一般会先检查该类是否已加载,如果没有加载,则去调用父类加载器,若没有父类加载器,则迷人使用启动类夹杂爱作为自己的父加载器,如果父类无法加载时,才去调用自己的类加载。
启动类加载器主要负责加载最为基础、最为重要的类,比如jre下的jar包。除了启动类加载器之外,还有另外两个重要的类加载器是,扩展类加载器(extension class loadeer)和应用类加载器(application class loader);
扩展类加载器的父类是启动类加载器,他负责加载相对次要、但又通用的类,比如加载相对次要的类;
应用类加载器的父类加载器则是扩展类加载器,他负责加载应用程序路径下的类(应用程序路径:classpath所指向的路径)
而这种关系一般不会用继承,而是用组合关系来复用父类加载器的代码;
类加载器除了加载类之外,还提供了命名空间的作用,在java虚拟机中,类的唯一性就是由类的加载器实例及列的全名一同确定,即使是同一字节流,经由不同的类加载器,也会得到两个不同的类。
链接:
是指将创建成的类合并至java虚拟机中,使之能够执行的过。他可以分验证,准备,解析三个阶段。
验证的目的是:Java编译器生成的类文件必须满足java虚拟机的约束。就是.class文件是否满足虚拟机的要求并且不会威胁到虚拟机自身。不符合时会抛出异常java.lang.VerifyError.
本文介绍Java虚拟机如何通过加载、链接、初始化等步骤加载类,包括不同类加载器的角色及其双亲委派模型,以及验证阶段确保.class文件的正确性和安全性。

被折叠的 条评论
为什么被折叠?



