首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

Java软件工程师从笨鸟到初学者之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader

2012-11-03 
Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader欢迎阅读本专题的

Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader

      欢迎阅读本专题的其他博客:


                    深入java虚拟机(一)——java虚拟机底层结构详解

                         深入java虚拟机(二)——类的生命周期(上)类的加载和连接

                         深入java虚拟机(三)——类的生命周期(下)类的初始化

                         深入java虚拟机(四)——java虚拟机的垃圾回收机制

                         深入java虚拟机(五)——java本地接口JNI详解

                         深入java虚拟机(六)——类加载的父亲委托机制



         ClassLoader类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称(即为包名加类名的全称),那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。 作为所有类加载器的基类,ClassLoader的内部实现机制还是值得我们细细研究一下的。所以今天我就带领大家一起来看一下Classloader的内部实现源码。


首先我们来看一下Classloader类的两个构造方法。

             Java软件工程师从笨鸟到初学者之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader


        从上边的帮助文档中我们可以发现,在创建一个classloader的实例时我们可以显示的指出他的父加载器,也可以不指定,不指定的时候他的默认的父加载器是系统加载器。我们来看一下源码的实现:

   



        虽然jdk已经解释的很清楚了,但是有一点我还是要在补充一下。从上面的源码我们可以看出loadClass方法是一个递归的方法,一直往上找,一直找到根类加载器为止,然后让类加载器去加载这个类。至于跟加载器是怎么实现的我们就不得而知了。因为跟类加载加载类时一个本地方法,他是用c++写的。我们无法看到他的源码。这样验证了在前面我们所说的类加载器的父类委托机制。


下面我们来看一下findClass方法,我们在上面的代码中发现。在loadClass方法中有调用这个findclass方法,下面我们首先来看一下API对这个方法的介绍:


Java软件工程师从笨鸟到初学者之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader


       从上面介绍我们可以看出,这个方法主要是来查找我们的类文件的。我们在自定义我们自己的类加载器的时候应该重写这个方法,因为jdk中对这个方法基本没有实现什么,这就需要我们自己来重写这个方法,用我们自己的所定义的方法去查找类文件。不信。你可以看一下他的源码实现:


protected Class<?> findClass(String name) throws ClassNotFoundException {throw new ClassNotFoundException(name);    }


暂时先介绍这些吧。其他的方法基本都差不多,最近感觉博客越来越难写,越来越吃力。越来越发现底层理论的缺乏。希望通过自己的努力,可以慢慢改变这个现状。


------------------------------------------------------------------------

《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载


http://blog.csdn.net/csh624366188/article/details/7999247




3楼csh6243661886天前 16:48
仅仅带领大家简单认识一下,要想深入了解,自己去源码看看去吧。。。
2楼lmj8109603976天前 13:15
谢谢分享。。
Re: csh6243661886天前 16:48
回复lmj810960397n共同学习。
1楼emoven6天前 11:35
看起有点深奥
Re: csh6243661886天前 11:54
回复emovenn其实是吓唬人的。。呵呵

热点排行