加载

加载(Loading)阶段需要完成三件事

  1. 通过一个类的全限定名来获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

《Java虚拟机规范》对这三点要求其实并不是特别具体,留给虚拟机实现与java应用的灵活度都是相当大的。

非数组类与数组类的加载

非数组类由虚拟机内置的引导类加载器完成,也可以由用户自定义的类加载器完成。

对于数组类,数组类本身不通过类加载器创建,它是由java虚拟机直接在内存中动态构建出来的。

但数组类与类加载器仍有密切关系,因为数组类的元素类型(Element Type,指的是数组去掉所有维度后的类型)最终还是靠类加载器来完成加载。

一个数组类(简称C)创建过程遵循一下规则:

  • 如果数组的组件类型(Component Type,指的是数组去掉一个维度的类型)是引用类型,那就递归此加载过程去

    加载这个组件类型,数组C将被标识在加载该组件类型的类加载器的类名称空间上。

  • 如果数组的组件类型不是引用类型,java虚拟机将会把数组C标记为与引导类加载器关联。

  • 数组类的可访问性与它的组件类型的可访问性一致,如果组件类型不是引用类型,

    它的数组类的可访问性将默认为public,可被所有的类和接口访问到