JVM

Java类加载器
类加载器的父亲委托机制(Parent Delegation),这里的父亲不是继承的关系,其实是一种组合的关系。也就是说子加载器不一定继承了父加载器。
类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能够更好地保证Java平台的安全。在此委托机制中,出了Java虚拟机自带的根加载器以外,其余的类加载器都有且仅有一个父加载器。当Java程序请求加载器loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若父加载器能加载,则由父加载器完成加载任务,否则才由loader1本身加载Sample类。

Java虚拟机自带以下几种加载器。
根(Bootstrap)类加载器:该加载器没有父加载器。它负责加载虚拟机的核心类库,如java.lang.*等。例如java.lang.Object就是由根加载器加载的。根加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根加载器的实现依赖于底层操作系统,属于虚拟机实现的一部分,它并没有继承java.lang.ClassLoader类。
扩展(Extension)类加载器:它的父加载器为根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的jre\lib\ext子目录(扩展目录)下加载类库,如果把用户创建的JAR文件放在这个目录下,也会自动由扩展加载器加载。扩展加载器是纯Java类,是java.lang.ClassLoader类的子类。
系统(System)类加载器:也称应用加载器,它的父加载器为扩展类加载器。它从环境变量classpath或者从系统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父类加载器。系统类加载器是纯Java类,是java.lang.ClassLoader的子类。

除了以上虚拟机自带的加载器以外,用户还可以定制自己的类加载器(User-defined Class Loader)。Java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器应该继承ClassLoader类。

在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器以外,其余的类加载器都有且只有一个父加载器。

posted @ 2013-09-26 18:39  周建群  阅读(113)  评论(0编辑  收藏  举报