哈哈,今天没事做,但心情不错,所以写这篇文章.
类装载器是Java程序运行时不可缺少的一部分,它的任务是把由Java源程序编译成的class文件读入到内存中,确切的说是装入到JVM的内存中,应为JVM是一台抽象的计算机,它有着自己的CPU,内存等. 在class文件中包含了一个类的各种信息,当执行java XXX命令运行一个以XXX为初始类的Java程序时,类装载器会把XXX的class文件装载到内存,然后根据该class文件中包含的信息在方法区中生成一个JVM的内部数据结构,该数据结构里的内容是XXX类的类型信息,大家知道每个类都会对应一个Class对象,该对象就是JVM根据这个类型信息在堆区中创建的,这个对象含有一个指向方法区中对应类型信息的指针,除此之外,该Class对象还包含一个指向类装载器的指针,根据这个Class对象就可以创建对象,可以访问装载本类的类装载器,还可以访问方法区中的数据(Java反射机制就是这样实现的).
一.Java中有四中类装载器:启动类装载器,扩展类装载器,类路径类装载器,自定义类装载器.下面将围绕着这三种类装载器做一个详细的描述:
1.启动类装载器:也叫引导类装装载器,它是JVM内部的类装载器,用C++编写,作用是装载Java核心类库中的类,比如说一个Java虚拟机目录为D:\JDK1.5,则启动类装载器负责装载D:\JDK1.5\jre\lib\rt.jar,rt.jar为Java核心类库,比如我们常用到的java.lang包中的System类,由于启动类装载器是供JVM使用的,Java程序并不能直接使用,下面举个例子来说明:
class Test {
public static void main(String[] args) {
System.out.println(System.class.getClassLoader());
}
}
上述程序打印出装载System类的类装载器,而打印出的却是null,说明了启动类装载器不能直接调用.
2.扩展类装载器:它负责装载Java的扩展类,比如说一个Java虚拟机目录为D:\JDK1.5,则它负责加载D:\JDK1.5\jre\lib\ext下的类库中的类,假如ext目录下有个jar包,包里有个Test类,包名为org.test,则可以用org.test.Test.class.getClassLoader()方法打印出该类加载器,可以看到结果为sun.misc.Launcher$ExtClassLoader,说明Test类由扩展类装载器装载,可以根据需要把自己写的类打成jar包放到ext目录下.
3.类路径类装载器:也可以叫系统类装载器,它负责装载当前classpath下的类,也就是当我们要运行一个Java程序时初始类的包所在的目录,比如在D:\test下有个Test.class,它是程序的初始类,当�