类加载器的父亲委托机制深度详解

一、类加载器
1、父亲委托机制(Parent Delegation)
类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能够更好的保证java平台的安全,在此委托机制中,除了Java虚拟机自带的根类加载器外,其余的类加载器都有且只有一个父类加载器。当java程序请求加载器loader加载Sample类时,loader首先委托自己的父加载器去加载Sample类,若加载器能加载,则由父加载器完成加载任务,则由父加载器完成加载任务,否则,才有加载器loader本身加载Sample类。
父加载器不是继承关系。也就是说子加载器不一定是继承了父加载器。
2、java虚拟机自带的几种加载器
(1) 根(Bootstrap)类加载器:该类加载器没有父加载器,他负责加载虚拟机的核心类库,如java.lang.*等。根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根类加载器的实现依赖于底层操作系统,属于虚拟机的实现的一部分,他并没有继承java.lang.ClassLoader类。
(2)扩展(Extension)类加载器:它的父类加载器为根类加载器。他从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的jrelibext子目录(扩展目录)下加载类库,如果把用户创建的JAR文件放在这个目录下,也会自动有扩展类加载器加载。扩展类加载器是纯java类,是java.lang.ClassLoader类的子类。
(3) 系统(System)类加载器:也称为应用加载器,他的父类加载器为扩展类加载器。他从环境变量classpath或者系统属性java.class.path所指定的目录中加载类。他是用户自定义的类加载器的默认父加载器。系统类加载器是纯java类,是java.lang.ClassLoader子类。

除了以上虚拟机自带的加载器外,用户还可以定制自己的类加载器。java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器应该继承ClassLoader类。
他们之间的关系为:

当生成一个自定义的类加载器实例时。如果没有指定他的父加载器,那么系统类加载器将成为该类加载器的父加载器。
API中解释:
Creates a new class loader using the ClassLoader returned by the method getSystemClassLoader() as the parent class loader.
父亲委托机制的优点是能够提高软件系统的安全性。因此在此机制下,用户自定义的类加载器应该有父类加载器加载的可靠类,从而防止不可靠甚至恶意的代码代替由父加载器加载的可靠代码。例如:java.lang.Object类总是由根类加载器加载,其他任何用户自定义的类加载器都不可能加载含有恶意代码的java.lang.Object类。
3、命名空间
每个类加载器都有自己的命名空间,命令空间由该加载器及其所有父加载器所加载的类组成。在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类;在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类。
4、运行时包
由同一类加载器加载的属于相同包的类组成了运行时包。决定两个类是不是属于同一个运行时包,不仅要看他们的包名是否相同,还要看定义类加载器是否相同。只有属于同意运行时包的类才能互相访问包可见(即默认访问级别)的类和类成员。这样的限制能避免用户自定义的类冒充核心类库的类,去访问核心类库的包可见成员。建设用户自己定义了一个类java.lang.SPy,并用用户自定义的类加载器加载,由于java.lang.Spy和核心类库java.lang.*由不同的加载器加载,他们属于不同的运行时包,所以java.lang.Spy不能访问核心类库java.lang包中的包可见成员。
5、创建用户自定义的类加载器
要创建用户自己的类加载器,只需要继承扩展java.lang.ClassLoader类,然后覆盖他们的findClass(String name)方法即可,该方法根据参数指定的类的名字,返回对应的Class对象的引用。
6、实例:

Sample.java:

Dog.java:

class文件的路径:
serverlib文件下:Dog.class,Sample.class
clientlib文件夹下没有文件
otherlib文件夹下:Dog.class,Sample.class
syslib文件夹下:MyClassLoader.class

运行结果:

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91499 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年10月19日
下一篇 2016年10月19日

相关推荐