黑马程序员技术交流社区

标题: 有关类加载器的一些疑问? [打印本页]

作者: 闾丘日月    时间: 2012-6-4 07:52
标题: 有关类加载器的一些疑问?
听了张老师讲的类加载器的相关知识,比如类委托机制以后,感觉清晰无比,于是小弟自己翻阅源代码求证,但在此过程中遇到了问题,发帖求教高手。
我阅读的源代码版本为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的父加载器。
作者: 闾丘日月    时间: 2012-6-4 07:59
抱歉,我自己混淆了概念。。。。发完贴没多久就想到了
super代表的是父类,父类和父加载器的概念不是一样的,AppClassLoader的声明为
  static class AppClassLoader extends URLClassLoader
可以看到,它的父类其实是URLClassLoader,也就是它调用的应该是URLClassLoader的loadClass方法,而URLClassLoader里面的findClass就可以通过路径来查找
因为类声明和函数实现隔得很远,所以开始没看到类声明,想当然的将super理解成了它的父亲类加载器。。。
自问自答了,不是有意的,抱歉。
作者: 袁錦泰    时间: 2012-6-4 10:58
闾丘日月 发表于 2012-6-4 07:59
抱歉,我自己混淆了概念。。。。发完贴没多久就想到了
super代表的是父类,父类和父加载器的概念不是一样的 ...

问题提得很好...




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