黑马程序员技术交流社区
标题:
关于类加载器的问题。总不能理解
[打印本页]
作者:
gzbbxu
时间:
2013-6-22 10:13
标题:
关于类加载器的问题。总不能理解
是当前线程的类加载器去加载线程中的第一个类。
每个类加载器加载类时,又先委托给其上级类加载器。
总觉得这两句话有点矛盾。。不能理解
作者:
万琪
时间:
2013-6-22 11:25
很简单,,妈妈生了你,,但是妈妈是姥姥生的,,所以,,你和姥姥就是委托了,,
作者:
影响力147753321
时间:
2013-6-22 12:04
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;
}
通过上面的代码分析,可以明白类加载的详细过程。说简单些,就是父类逐级递归委托,成功就返回。。不成功,就反向逐级加载,直至到自身来加载。自身不能加载就抛异常。这样就保证了加载的安全性,虽说有些麻烦。不知我说的这些能不能帮你理解一下。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2