快速业务通道

Java虚拟机类装载的原理及实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
请求的类;(5) 在虚拟机中定义所请求的类;(6) 解析所请求的类;(7) 返回所请求的类。

所有的Java 虚拟机都包括一个内置的类装载器,这个内置的类库装载器被称为根装载器(bootstrap ClassLoader)。根装载器的特殊之处是它只能够装载在设计时刻已知的类,因此虚拟机假定由根装载器所装载的类都是安全的、可信任的,可以不经过安全认证而直接运行。当应用程序需要加载并不是设计时就知道的类时,必须使用用户自定义的装载器(user-defined ClassLoader)。下面我们举例说明它的应用。

public abstract class MultiClassLoader extends ClassLoader{  ...  public synchronized Class loadClass(String s, boolean flag)   throws ClassNotFoundException   {    /* 检查类s是否已经在本地内存*/    Class class1 = (Class)classes.get(s);    /* 类s已经在本地内存*/    if(class1 != null) return class1;    try/*用默认的ClassLoader 装入类*/ {     class1 = super.findSystemClass(s);     return class1;    }    catch(ClassNotFoundException _ex) {     System.out.println(">> Not a system class.");    }    /* 取得类s的字节数组*/    byte abyte0[] = loadClassBytes(s);    if(abyte0 == null) throw new ClassNotFoundException();    /* 将类字节数组转换为类*/    class1 = defineClass(null, abyte0, 0, abyte0.length);    if(class1 == null) throw new ClassFormatError();    if(flag) resolveClass(class1); /*解析类*/    /* 将新加载的类放入本地内存*/    classes.put(s, class1);    System.out.println(">> Returning newly loaded class.");    /* 返回已装载、解析的类*/    return class1;   }   ... }

Java虚拟机类装载的原理及实现(3)

时间:2010-09-22

三、Java虚拟机的类装载原理

前面我们已经知道,一个Java应用程序使用两种类型的类装载器:根装载器(bootstrap)和用户定义的装载器(user-defined)。根装载器是Java虚拟机实现的一部分,举个例子来说,如果一个Java虚拟机是在现在已经存在并且正在被使用的操作系统的顶部用C程序来实现的,那么根装载器将是那些C程序的一部分。根装载器以某种默认的方式将类装入,包括那些Java API的类。在运行期间一个Java程序能安装用户自己定义的类装载器。根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化。 Java类装载器的体系结构如下所示:

Java虚拟机类装载的原理及实现 - 编程入门网

图1 Java的类装载的体系结构

Java的类装载模型是一种代理(delegation)模型。当JVM 要求类装载器CL(ClassLoader)装载一个类时,CL首先将这个类装载请求转发给他的父装载器。只有当父装载器没有装载并无法装载这个类时,CL才获得装载这个类的机会。这样, 所有类装载器的代理关系构成了一种树状的关系。树的根是类的根装载器(bootstrap ClassLoader) , 在JVM 中它以"null"表示。除根装载器以外的类装载器有且仅有一个父装载器。在创建一个装载器时, 如果没有显式地给出父装载器, 那么JVM将默认系统装载器为其父装载器。Java的基本类装载器代理结构如图2所示:

Java虚拟机类装载的原理及实现 - 编程入门网

图2 Java类装载的代理结构

Java虚拟机类装载的原理及实现(4)

时间:2010-09-22

下面针对各种类装载器分别进行详细的说明。

根(Bootstrap) 装载器:该装载器没有父装载器,它是JVM实现的一部分,从sun.boot.class.path装载运行时库的核心代码。

扩展(Extension) 装载器:继承的父装

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号