java class loader 学习

来源:互联网 发布:苏州方正软件 编辑:程序博客网 时间:2024/05/19 03:44

写这篇文章之前我向部分人推荐IBM developerWorks网站,我好几次不懂的问题最后都是通过这里面的文章得到了理解,推荐它一是因为它的内容细致,很多都有图片讲解;二是它的文字排版很好,让人看着很清晰舒服,例如我这里学习的类加载就是参考这篇文章来学习的:深入探讨 Java 类加载器

学习这篇文章之前我要把我以前以为自己了解了,实际一知半解的概念重新学习一下:

java字节码:程序员编写之后经过编译之后就成为了字节码,以供jvm使用(jvm只能识别字节码)。

java虚拟机(JVM):jvm负责将字节码转换成机器可识别的代码。jvm之所以称之为虚拟是因为它是既不依赖于操作系统也不依赖于硬件的一种接口。在实际的功能中,我们系统往往会和底层的操作系统进行交互,那时因为java提供了一种native方法,这种方法可以被其他语言实现供java调用。

java运行时环境(JRE):jre包含了jvm、java二进制文件和其它类文件。jre不包含编译器、调试器之类的开发工具。如果你只需要运行java程序,就没有必要安装jdk,仅仅只装jre就足够。

这里有一点非常重要:不管是jdk还是jre如果想要运行java程序都离不开jvm,我们真正使程序运行起来的是jvm,jdk和jre就是个平台而已。

看完这些概念,我们来学习类加载,在学之前我们要知道为什么学?因为所有的java文件都是通过类加载器加载到虚拟机中的。

通过学习我们发现不同的加载器即使对同一个对象进行类加载,他们也是会出现java.lang.ClassCastException异常。因为java虚拟机判断两个类是否相同有两点:1、类名是否相同;2、类加载器是否相同。

加载器的加载顺序如下:


我们通过一个小的例子看一下,这个折腾我一天也没搞太明白:

String pathname = "D:\\output.txt"; //绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径 File filename = new File(pathname); // 要读取以上路径的input.txt文件

 /**     * Creates a new <code>File</code> instance by converting the given     * pathname string into an abstract pathname.  If the given string is     * the empty string, then the result is the empty abstract pathname.     *     * @param   pathname  A pathname string     * @throws  NullPointerException     *          If the <code>pathname</code> argument is <code>null</code>     */    public File(String pathname) {if (pathname == null) {    throw new NullPointerException();}this.path = fs.normalize(pathname);this.prefixLength = fs.prefixLength(this.path);    }

一开始我以为pathname就是我传入的D:\\output.txt,可后来发现不是这样,它的记载顺序是这样的:

一开始会加载Java\jdk1.6.0_24\jre\lib\ext下的所有jar文件,这里的意思就是首先是扩展类加载器进行加载

接着开始加载classpath,我程序的路径是这样的(\D:\workspace\classloader-test\bin\),而且循环加载了4次,我没太搞明白为什么要循环,单纯来说加载所有的class文件我还理解



0 0