黑马程序员技术交流社区
标题:
关于类加载器的小疑问
[打印本页]
作者:
金龙
时间:
2012-7-30 07:10
标题:
关于类加载器的小疑问
public class ClassLoaderTest {
/**
* 类加载器的树形结构和委托机制
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//加载App这个加载器的类加载器为什么不是Ext加载器而是boot加载器呢?
System.out.println(ClassLoaderTest.class.getClassLoader().getClass()
.getClassLoader());
//为什么获取这个加载器的父类就是Ext加载器?
ClassLoader loader = ClassLoaderTest.class.getClassLoader();
while(loader!=null){
System.out.println(loader.getClass().getName());
loader=loader.getParent();
}
System.out.println(loader);
}
}
为什么App类加载器的类加载器是boot,而这个类加载器的父亲却是Ext
作者:
尤洋
时间:
2012-7-30 08:13
并不是说加载APP的类加载器必须是boot加载器,
而是因为类加载器也可能是Java类,其它Java类的类加载器本身也要被类加载器加载,所以
必须有第一个类加载器不是java类
,这个就是BootStrap。
BootStrap嵌套在Java虚拟机内核中的,jvm启动,这个类就会启动,它是由c++语言编写的,
另外boot加载器是顶级加载器,没有父类加载器
所以这里
第一次用的是boot加载器,与加载的是不是APP无关。
排除
第一个加载器后,后面当需要加载时该派哪个加载器则根据
类加载器的委托机制来判断。这里我偷点懒直接复制一段你自己看看:
1.首先是当前线程的类加载器去加载线程中的第一个类。
2.如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。
3.还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
4.每个类加载器加载类时,又先委托给其上级类加载器
5.当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChlid方法,即使有,那么有多个儿子,找哪一个呢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2