7.1.1装载

装载阶段由三个基本动作组成,要装载一个类型,Java虚拟机必须:

•通过该类型的完全限定名,产生一个代表该类型的二进制数据流。

•解析这个二进制数据流为方法区内的内部数据结构。

•创建一个表示该类型的java.lang.Class类的实例。

这个二进制数据流可能遵守Java class文件格式,但是也可能遵守其他的格式。就像前一章提到的那样,所有的Java虚拟机实现必须能识别java class文件格式,但是个别的实现也可以识别其他的二进制格式。

有了类型的二进制数据之后,Java虚拟机必须对这些数据进行足够的处理,然后它才能创建类java.lang.Class的实例对象。虚拟机必须把这些二进制数据解析为与实现相关的内部数据结构 (请参考第5章中关于存储类数据的可能数据结构的讨论)。装载步骤的最终产品就是这个Class类 的实例对象,它成为Java程序与内部数据结构之间的接口。要访问关于该类型的信息(它们是存 储在内部数据结构中的),程序就要调用该类型对应的Class实例对象的方法。这样一个过程,就 是把一个类型的二进制数据解析为方法区中的内部数据结构、并在堆上建立一个Class对象的过 程,这被称为“创建”类型。

就像在前一章曾提到的,Java类型要么由启动类装载器装载,要么通过用户自定义的类装载 器装载。启动类装载器是虚拟机实现的一部分,它以与实现无关的方式装载类型(包括Java API 的类和接口),用户自定义的类装载器是类java.lang.ClassLoader的子类实例,它以定制的方式装入类。用户自定义的类装载器的内部工作机制将在第8章中更详细地说明。

类装载器(启动型或者用户自定义的)并不需要一直等到某个类型“首次主动使用”时再 去装入它。Java虚拟机规范允许类装载器缓存java类型的二进制表现形式,在预料某个类型将要 被使用时就装载它,或者把这些类型装载到一些相关的分组里面。如果一个类装载器在预先装 载时遇到问题,无论如何,它应该在该类型被首次主动使用时报告该问题(通过抛出一个LinkageError异常的子类)。换句话说,如果一个类装载器在预先装载时遇到缺失或者错误的 class文件,它必须等到程序首次主动使用该类时才报告错误。如果这个类一直没有被程序主动 使用,那么该类装载器将不会报告错误。

猜你喜欢

转载自www.cnblogs.com/mongotea/p/11979542.html