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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闾丘日月 中级黑马   /  2012-6-4 07:52  /  1598 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

听了张老师讲的类加载器的相关知识,比如类委托机制以后,感觉清晰无比,于是小弟自己翻阅源代码求证,但在此过程中遇到了问题,发帖求教高手。
我阅读的源代码版本为openjdk-6-src-b25-01_may_2012
具体问题是这样的,根据张老师的讲述,除了boot外所有的类都有类加载器,java虚拟机会调用类加载器的loadClass方法来加载类,类加载器是由自己的父亲类加载器来加载,而默认的java虚拟机的三个类加载器分别为boot,ext,和app,而且我们还知道ExtClassLoader和AppClassLoader分别是从不同搜索路径下加载类,但是从AppClassLoader的源代码里面
        public synchronized Class loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            int i = name.lastIndexOf('.');
            if (i != -1) {
                SecurityManager sm = System.getSecurityManager();
                if (sm != null) {
                    sm.checkPackageAccess(name.substring(0, i));
                }
            }
            return (super.loadClass(name, resolve));
        }
可以看到,它只在前面做了一些必要的安全检查的事情,然后就扔给它的父亲加载器了ext了,而并没有自己的加载路径,那么ext和app的路径应该是一样的才对啊?
要么ext根本就不是app的父加载器。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
抱歉,我自己混淆了概念。。。。发完贴没多久就想到了
super代表的是父类,父类和父加载器的概念不是一样的,AppClassLoader的声明为
  static class AppClassLoader extends URLClassLoader
可以看到,它的父类其实是URLClassLoader,也就是它调用的应该是URLClassLoader的loadClass方法,而URLClassLoader里面的findClass就可以通过路径来查找
因为类声明和函数实现隔得很远,所以开始没看到类声明,想当然的将super理解成了它的父亲类加载器。。。
自问自答了,不是有意的,抱歉。
回复 使用道具 举报
闾丘日月 发表于 2012-6-4 07:59
抱歉,我自己混淆了概念。。。。发完贴没多久就想到了
super代表的是父类,父类和父加载器的概念不是一样的 ...

问题提得很好...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马