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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金龙 中级黑马   /  2012-7-30 07:10  /  1502 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
并不是说加载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方法,即使有,那么有多个儿子,找哪一个呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马