黑马程序员技术交流社区
标题:
有关类加载器的一些疑问?
[打印本页]
作者:
闾丘日月
时间:
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