类加载器
类加载器用来把类加载器到java虚拟机,从JDK1.2版本开始, 类的加载过程采用父亲委托机制,这种机制能更好的保证java平台的安全。在此委托机制中,除了java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。当java程序请求加载器loader1加载sample类时,loader首先委托自己的父加载器去加载sample类,若父加载器能加载,则由父加载器完成加载任务,否则才由加载器loader1本身加载sample类。
若有一个类加载器能成功加载sample类,那么这个类加载器被称为定义类加载器,所有能成功返回Class对象的引用的类加载器(包括定义类加载器)都被称为初始类加载器。例如:loader1实际加载了sample类,则loader1为sample类定义类加载器,loader2和loader1为sample类的初始类加载器。
java虚拟机自带了以下几种加载器。
- 根(bootstrap)加载器:该加载器没有父加载器。它负责加载虚拟机的核心类库,如java.lang.*等。例如从下例可以看出,java.lang.Object就是由根类加载器加载的。根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根类加载器的实现依赖于底层操作系统,属于虚拟机的实现部分,它并没有继承java.lang.ClassLoader类。
- 扩展类加载器:它的父加载器为根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的jre/lib/ext子目录下加载类库,如果把用户创建的JAR文件放在这个目录下,也会自动由扩展类加载器加载。扩展类加载器是纯java类,是java.lang.ClassLoader类的子类。
- 系统类加载器:也称为应用类加载器,它的父加载器为扩展类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。系统类加载器是纯java类,是java.lang.ClassLoader类的子类
除了以上虚拟机自带的加载器以外,用户还可以定制自己的类加载器。java提供了抽象类java .lang.ClassLoader,所有用户自定义的类加载器应该继承ClassLoader类
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
Class clazz=Class.forName("java.lang.String");//是根加载器加载
System.out.println(clazz.getClassLoader());
Class clazz1=Class.forName("org.C");//系统加载器加载
System.out.printl(clazz1.getClassLoader());
}
}
class C{}
result:
null
sun.misc.Launcher$AppClassLoader@53004901