类加载的第一个阶段:加载
加载是整个类加载过程的第一个阶段。
注意:加载只是类加载的一个部分,并不是类加载本身</>
我们可以粗略的将被加载的类分为非数组类和数组类
非数组类
作为一个非数组类java虚拟机在类加载阶段的总共会完成如下三件事
加载时java虚拟机完成的三件事
1、通过一个类的全限定类名来获取另一此类的二进制字节流
2、将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
需要注意的是:
java虚拟机并没有限制我们从什么地方获取二进制流
我们可以从如下几个方式获取该类的二进制流:
1、从zip包获取(如jar,war……)等
2、从网络流中获取:如Web Applet等
3、运行时动态获取:如jsp技术
4、由其他文件生成
5、从数据库中获取
……等等
数组类
当类加载的对象是一个数组时,我们需要区分数组类和数组的元素类两个概念
数组类
数组类,部分资料显示为Arrays类,虽然这个类本身也也是通过启动类加载器(后面介绍)进行加载的,但并不是它。
这里的数组类指的应该是一个我们无法直接看到的类,也就是数组的类。
我们可以粗略的将int[] 也认为是一个了类型。也就是数组类。
数组类本身并不通过类加载器创建,它是直接由java虚拟机在内存中动态构造出来。
但是数组的元素类型还是需要靠类加载器来完成加载。
数组的元素类型
这里的数组的元素类型指的是数组去掉去掉了所有元素的类型
组件类型
这里的组件类型,指的是数组去掉一个维度的类型
数组类的加载
一个数组类的加载满足如下规则
1、如果组件类型是引用类型,将递归加载这个组件类型
2、如果组件类型不是引用类型,虚拟机将会把数组类标记为与引导类加载器关联
3、数组类的可访问性与组件类型可访问一致,若组件类型不是引用类型,其数组类可访问性则默认为public,可以被所有接口和类访问。
注意:一定是先加载,后连接,但是加载阶段与连接阶段是交叉进行的,有可能加载阶段还未结束,连接阶段已经开始
这里的链接阶段指的是:
类加载中验证、准备、解析三个阶段。