频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源:sun 作者:刘学超 出处:巧巧读书 2006-01-17 进入讨论组

  2.3 装载的应用

  一般来说,我们使用虚拟机的类装载时需要继承抽象类java.lang.ClassLoader,其中必须实现的方法是loadClass(),对于这个方法需要实现如下操作:(1) 确认类的名称;(2) 检查请求要装载的类是否已经被装载;(3) 检查请求加载的类是否是系统类;(4) 尝试从类装载器的存储区获取所请求的类;(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;
  }
  ...
}
图 文 结 合:http://www.qqread.com/java/w292227600.html 更多文章 更多内容请看虚拟机软件入门Java环境安装配置Java编程开发手册专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章