类加载过程--加载

类从加载到虚拟机内存中开始,到卸载出内存为止的步骤如下:http://www.jianshu.com/p/66ec69f174e8
本节主要介绍一下类的加载过程。
“加载”是“类加载”过程的一个阶段,在加载阶段,虚拟机需要完成一下几件事:
一.通过类的全限定名来获取定义此类的二进制字节流。
二.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
三.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
因为这三点并不是对虚拟机的具体要求,因此可以有多种不同的实现,比如通过类的权限定名获取类的二进制字节流,就可以通过1。1.JAR,EAR,WAR
2.网络(Applet)中获取二进制字节流。
3.运行时计算生成,这种场景使用的最多的就是动态代理技术,在java.lang.reflect.Proxy中,就用了ProxyGenerator.generateProxyClass来为特定接口生成形为"*$Proxy"的代理类的二进制字节流。
4.由其他文件生成的典型场景就是使用JSP应用,即由JSP文件声称对应的Class。
5.数据库中读取,例如有些中间件服务器(SAP Netwaver)可以选择把程序安装到数据库中来完成程序代码在集群间的分发。

加载阶段可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成,开发人员可以通过定义自己的类加载器去控制字节流的获取方式(即重写一个类加载器的loadClass()方法)。
例外:但对于数组类而言,情况有所不同,数组本身不通过类加载器创建,它是由java虚拟机直接创建的。但数组类与类加载器仍然有很密切的关系,因为数组类的元素类型(Element Type,指的是数组去掉所有纬度的类型)最终是要靠类加载器去创建:
如果数组的组件类型是引用类型 如:Object[]就递归采用本节中定义的加载过程去加载这个组件类型,数组C将在加载该组件类型的类加载器的类名称空间上被标识(一个类必须与类加载器一起确定唯一性)。
如果数组的组建类型不是引用类型如int[]数组,java虚拟机将会把数组C标记为与引导类加载器相关。
加载阶段与连接阶段部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段(验证,准备,解析都属于连接阶段)的内容,这两个阶段的开始时间仍然保持着固定的顺序。

你可能感兴趣的:(类加载过程--加载)