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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gzbbxu 中级黑马   /  2013-6-22 10:13  /  1249 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是当前线程的类加载器去加载线程中的第一个类。
每个类加载器加载类时,又先委托给其上级类加载器。
总觉得这两句话有点矛盾。。不能理解

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
万琪 来自手机 金牌黑马 2013-6-22 11:25:18
沙发
很简单,,妈妈生了你,,但是妈妈是姥姥生的,,所以,,你和姥姥就是委托了,,
回复 使用道具 举报
java类加载实行的双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
默认采用的双亲委派机制到底是什么模样:代码体现如下:
public Class<?> loadClass(String name)throws ClassNotFoundException {
        return loadClass(name, false);
}
protectedsynchronized Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException {
        // 首先判断该类型是否已经被加载
        Class c = findLoadedClass(name);
        if (c == null) {
            //如果没有被加载,就委托给父类加载或者委派给启动类加载器加载
            try {
                if (parent != null) {
//如果存在父类加载器,就委派给父类加载器加载
                    c = parent.loadClass(name, false);
                } else {
//如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name)
                    c = findBootstrapClass0(name);
                }
            } catch (ClassNotFoundException e) {
        // 如果父类加载器和启动类加载器都不能完成加载任务,才调用自身的加载功能
                c = findClass(name);
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
通过上面的代码分析,可以明白类加载的详细过程。说简单些,就是父类逐级递归委托,成功就返回。。不成功,就反向逐级加载,直至到自身来加载。自身不能加载就抛异常。这样就保证了加载的安全性,虽说有些麻烦。不知我说的这些能不能帮你理解一下。

评分

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

查看全部评分

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