类是平台能加载的最小程序代码单元,要将新的类加入到jvm的当前运行状态中,以下操作会被执行。首先,类文件必须被加载进来并连接,而且必须进行大量的验证。之后会提供一个代表该类的新class对象给正在运行的系统,并可以创建新的实例。
类的加载和连接
加载过程首先要读取构成类文件的字节流并给类的表现形式解冻。该过程一开始是创建一个字节数组,其内容通常是从文件系统中读取的,然后产生与加载的类对应的class对象。在这个过程中会对类做一些基本的检查,但在加载过程结束时,class对象还不成熟,所以类不可用。
加载完成后,下一步是把类连接起来。这一步骤分为三个子阶段:验证,准备和解析。验证阶段证实文件符合预期,不会引起系统的运行时错误或其他问题。之后是类的准备阶段,在类文件中引用其他的类型全部需要定位到,以确保类已经准备就绪。
验证是一个非常复杂的过程,分为一下几个阶段:首先是完整性检查。这实际是类加载过程中的一部分,会确保类文件格式良好,可以连接。接着是检查常量池中的符号信息是自相一致的,并要遵守常量的行为准测。其他不涉及代码的静态检查也在这一阶段完成,比如检查final方法是否被重写。之后是验证最复杂的部分——方法的字节码检查。要检查字节码行为良好并且不会试图摆脱VM的环境控制,一下是一些主要检查。是否所有方法都遵守访问控制关键字的限定;方法调用的参数个数和静态类型是否正确;确保字节码不会试图滥用堆栈;确保变量使用之前被正常初始化;检查变量是否被赋予恰当类型的值。
类的准备阶段包括分配内存和准备好初始化类中的静态变量,但不会现在初始化变量,也不会执行任何的VM字节码。
类的解析阶段会促使VM检查类文件中所引用的类型是不是都是已知的类型。如果有运行时未知的类,那它们也会被加载进来。
一旦需要加载的其他类型全被定为并且解析完成,VM就可以初始化那个最初要加载的类。这时所有的静态变量都可以被初始化,所有静态初始化代码快都会运行。这一步完成后,类的加载全部完成,类也就可以使用了。
类的加载和连接过程如图:
其实个人认为,类加载的过程就好比一个企业招聘的流程,首先,加载过程就相等于把企业招聘信息扩散出去,然后就有简历进来,然后企业就开始看简历,这差不多就像一个加载过程。被“加载”进来的简历,当然需要通过企业的面试阶段,来检查面试的对象是否符合企业的要求,这相当于连接过程的验证阶段。通过企业的验证后,发放了offer,然后企业就会着手准备给提供了offer员工的上班环境,给他分配好工作空间,工作时间和工作要求等,之后就可以召唤员工来上班了,公司就又多了一个员工。
注:参考资料《java程序员修炼之道》