黑马程序员技术交流社区

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

作者: 金龙    时间: 2012-7-30 07:10
标题: 关于类加载器的小疑问
public class ClassLoaderTest {

        /**
         * 类加载器的树形结构和委托机制
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                //加载App这个加载器的类加载器为什么不是Ext加载器而是boot加载器呢?
                System.out.println(ClassLoaderTest.class.getClassLoader().getClass()
                                .getClassLoader());
                //为什么获取这个加载器的父类就是Ext加载器?
                ClassLoader loader = ClassLoaderTest.class.getClassLoader();
                while(loader!=null){
                        System.out.println(loader.getClass().getName());
                        loader=loader.getParent();
                }
                System.out.println(loader);

        }
}
为什么App类加载器的类加载器是boot,而这个类加载器的父亲却是Ext
作者: 尤洋    时间: 2012-7-30 08:13
并不是说加载APP的类加载器必须是boot加载器,
而是因为类加载器也可能是Java类,其它Java类的类加载器本身也要被类加载器加载,所以
必须有第一个类加载器不是java类,这个就是BootStrap。
BootStrap嵌套在Java虚拟机内核中的,jvm启动,这个类就会启动,它是由c++语言编写的,
另外boot加载器是顶级加载器,没有父类加载器

所以这里第一次用的是boot加载器,与加载的是不是APP无关。排除
第一个加载器后,后面当需要加载时该派哪个加载器则根据
类加载器的委托机制来判断。这里我偷点懒直接复制一段你自己看看:
1.首先是当前线程的类加载器去加载线程中的第一个类。

2.如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。

3.还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

4.每个类加载器加载类时,又先委托给其上级类加载器

5.当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChlid方法,即使有,那么有多个儿子,找哪一个呢





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