【深入java虚拟机(4)】:类加载机制-编程开发技术

【深入java虚拟机(4)】:类加载机制-编程开发技术

ID:30785700

大小:149.65 KB

页数:10页

时间:2019-01-03

【深入java虚拟机(4)】:类加载机制-编程开发技术_第1页
【深入java虚拟机(4)】:类加载机制-编程开发技术_第2页
【深入java虚拟机(4)】:类加载机制-编程开发技术_第3页
【深入java虚拟机(4)】:类加载机制-编程开发技术_第4页
【深入java虚拟机(4)】:类加载机制-编程开发技术_第5页
资源描述:

《【深入java虚拟机(4)】:类加载机制-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、【深入Java虚拟机(4)】:类加载机制-编程开发技术【深入Java虚拟机(4)】:类加载机制原文出处:兰亭风雨类加载过程???类从被加载到虚拟机内存屮开始,到卸载出内存为止,它的整个生命周期包抓加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示:解析卸载使用初始化其中类加载的过程包描了加载、验证、准备、解析、初始化五个阶段。在这五个阶段屮,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期

2、绑定)。另外注意这里的几个阶段是按顺序开始,I佃不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。这里简要说明下Java中的绑定:绑定指的是把一个方法的调用与方法所在的类(方法主体)关联起來,对java來说,绑定分为静态绑定和动态绑定:•静态绑定:即询期绑定。在程序执行询方法已经被绑定,此吋山编译器或其它连接程序实现。针对java,简单的可以理解为程序编译期的绑定。java当中的方法只有final,static,private和构造方法是前期绑定的。•动态绑定:即晚期绑定,也

3、叫运行时绑定。在运行时根据具体对彖的类型进行绑定。在java屮,几乎所有的方法都是后期绑定的。??下面详细讲述类加载过程中每个阶段所做的工作。加载加载吋类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情:1、通过一个类的全限定名来获取其定义的二进制字节流。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3、在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。注意,这里第1条中的二进制字节流并不只是单纯地从Class文件中获取,比如它还可以从Jar包屮获取、

4、从网络屮获取(最典型的应用便是Applet)、由其他文件生成(JSP应用)等。相对于类加载的其他阶段而言,加载阶段(准确地说,是加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,而口在Java堆中也创建一个java.lang.Class类的对彖,这样便可以通过该对象访问方法区111的这些数据。说到加载,不得不提到类加载器,下面就具体讲述下类加载器。类加载器虽然只用

5、于实现类的加载动作,但它在Java程序小起到的作用却远远不限于类的加载阶段。对于任意一个类,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性,也就是说,即使两个类來源于同一个Class文件,只耍加载它们的类加载器不同,那这两个类就必定不相等。这里的"相等”包括了代表类的Class对象的equals()、isAssignab1eFrom()、islnstancc()等方法的返回结果,也包括了使用instanccof关键字对对彖所属关系的判定结果。站在Java虚拟机的角度来讲,只存在两种不同的类加载器:•启动类加载器:

6、它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有很多其他的虚拟机是用Java语言实现的),是虚拟机口身的一部分。•所有其他的类加载器:这些类加载器部由Java语言实现,独立于虚拟机之外,并且全部继承白抽象类javaJang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中Z后才能去加载其他的类。站在Java开发人员的角度來看,类加载器可以大致划分为以下三类:•启动类加载器:BootstrapClassLoader,跟上面相同。它负责加载存放在JDKjrelib(JDK代表JDK的安

7、装目录,下同)F,或fe-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如H.jar,所有的java.*开头的类均被BootstrapClassLoader加载)。启动类加载器是无法被Java程序直接引用的。•扩展类加载器:ExtensionClassLoadcr,该加载器由sun.misc.LaunchcrSExtClassL(^adcr实现,它负责加载JDKjrelibextH录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加

8、载器。•应用程序类加载器:ApplicationClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用八类路径(ClassPalh)所指定的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。