黑马程序员_基础加强_类加载器

来源:互联网 发布:linux 僵尸进程 编辑:程序博客网 时间:2024/05/22 17:30

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

类加载器

系统默认三大类加载器

BootStrap(只有这个超类不是java类,是C++编写的 ,获取其名字的话为null)

ExtClassLoader

AppClassLoader

每个类都有自己的特定加载位置.如下图





类加载器的委托机制

当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?

1.首先当前线程的类加载器去加载线程中的第一个类。

2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。

3.还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。


 每个类加载器加载类时,又先委托给其上级类加载器。

当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException.

每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。类装载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类装载器去进行真正的加载。当回退到最初的类装载器时,如果它自己也不能完成类的装载,那就应报告ClassNotFoundException异常


有一道面试,能不能自己写个类叫java.lang.System.

写了这个类也加载不到,因为会根据委托机制 超类BootStrap 会加载System.  (不过理论上我觉得自定义类加载器然后覆盖loadClass方法可以做到)



----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


0 0
原创粉丝点击