黑马程序员技术交流社区

标题: 类加载器的问题 [打印本页]

作者: 821728010    时间: 2013-6-5 20:09
标题: 类加载器的问题
本帖最后由 821728010 于 2013-6-7 19:47 编辑

代码写的一样,为什么第一行输出了类加载器,第二行却提示空指针异常?



public class Demo2 {
        public static void main(String[] args) {
                String s = "java";
                System.out.println(Demo2.class.getClassLoader().getClass().getName());
                System.out.println(s.getClass().getClassLoader().getClass().getName());
               
        }
}
作者: eycrckag    时间: 2013-6-5 20:15
第一行和第二行是一个类加载器,ok?
作者: eycrckag    时间: 2013-6-5 20:16
类加载器的树状组织结构

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:

引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

除了引导类加载器之外,所有的类加载器都有一个父类加载器。通过 表 1中给出的 getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。图 1中给出了一个典型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。


图 1. 类加载器树状组织结构示意图





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2