黑马程序员技术交流社区

标题: 类加载器的疑问 [打印本页]

作者: 杜鹏云    时间: 2012-8-20 18:10
标题: 类加载器的疑问
   Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,
     类装载器所做的工作实质是把类文件从硬盘读取到内存中。

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

作者: 李知伦    时间: 2012-8-20 18:18
每个类加载器负责加载特定位置的类,有分工啊,效率高啊

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

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

作者: 杜鹏云    时间: 2012-8-21 15:18
李知伦 发表于 2012-8-20 18:18
每个类加载器负责加载特定位置的类,有分工啊,效率高啊

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

谢谢解答




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2