听了张老师讲的类加载器的相关知识,比如类委托机制以后,感觉清晰无比,于是小弟自己翻阅源代码求证,但在此过程中遇到了问题,发帖求教高手。
我阅读的源代码版本为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的父加载器。 |