A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜鹏云 中级黑马   /  2012-8-20 18:10  /  1656 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,
     类装载器所做的工作实质是把类文件从硬盘读取到内存中。

  Java中的类装载器实质上也是类,功能是把类载入jvm中.
    我们知道jvm的类装载器有三个,层次结构如下:
      Bootstrap Loader - 负责加载系统类
            |
          - - ExtClassLoader - 负责加载扩展类
                          |
                      - - AppClassLoader - 负责加载应用类
问题:类加载器为何不是一个,而要有三个。而且这三个类加载器是如何协调工作的,也就是说碰到一个类需要加载时,它们之间是如何协调工作的,即java是如何区分一个类该由哪个类加载器来完成呢

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
每个类加载器负责加载特定位置的类,有分工啊,效率高啊

当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?这就涉及到类加载器的委托机制

首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
李知伦 发表于 2012-8-20 18:18
每个类加载器负责加载特定位置的类,有分工啊,效率高啊

当Java虚拟机要加载一个类时,到底派出哪个类加载器 ...

谢谢解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马