类加载器

本文从以下方面介绍类加载器:

一、类与类加载器

二、双亲委派模型

一、类与类加载器

       类加载器:通过一个类的全限定名来获取该类的二进制字节流,该动作在虚拟机的外部执行,方便让应用程序自己决定获取所需要的类。实现该动作的代码模块成为“类加载器”。

1、类与类加载器

     ① 类加载过程中的“加载”阶段需要用到类加载器;

     ②对于任意一个类而言,都需要由加载该类的类加载器以及类本身来唯一确定其在虚拟机中的唯一性;

     ③通俗而言:两个类是否相等,是由类加载器以及class文件共同决定的

     ④此处“相等”指的是:Class对象的equals(),isInstance(),isAssignableFrom()方法的返回结果,同样也包括instanceof关系做对象所属关系的判定;

二、双亲委派模型

       

1、Java虚拟机的角度

       有两种不同的类加载器:

       ①启动类加载器(Bootstrap ClassLoader):c++语言实现,为虚拟机自身的一部分;

       ②其他类加载器:java语言实现,独立于虚拟机之外,全部继承自抽象类java.lang.ClassLoader

2、开发人员的角度

      有三类类加载器:

     

      ①启动类加载器(Bootstrap ClassLoader):加载<JAVA_HOME>\lib目录中,或-Xbootclasspath参数所指定的路径中,并且为虚拟机所识别的类库加载到虚拟机的内存中;

     

      ②扩展类加载器(Extension ClassLoader):加载<JAVA_HOME>\lib\ext目录中,或者是java.ext.dirs系统变量所指定的路径中的所有类库;

     

      ③应用程序类加载器(Application ClassLoader):该类加载器是由ClassLoader中的getSystemClassLoader来实现,因此也别成为系统的类加载器。加载用户路径下(classpath)上所指定的类库,用户可以直接使用,应用程序中没有自定义过类加载器,则该加载器为默认类加载器。

3、类加载器双亲委派模型



 

(1)图中所展示的类加载器之间的层次关系,称为类加载器的双亲委派模型(Parent Delegation Model);

(2)双亲委派模型中,启动类加载器没有父类加载器外,其他类加载器都有父类加载器,而子父类之间的关系不是通过继承实现的,而是通过组合关系来复用父类加载器的代码

(3)双亲委派模型工作过程:当加载一个类时,子类加载器先将加载工作委派给父类加载器,每一层次的类加载器都是如此,加载的请求到了顶层启动类加载器仍无法完成加载工作,则子类的加载器才会尝试加载工作;

(4)使用双亲委派模型加载类,显而易见的好处是,java类随着他的类加载器也有了优先级的层次关系。如:java.lang.Object,无论什么环境下都是有启动类加载器加载,因此,在程序中各种类加载器环境下该类都是同一个类

猜你喜欢

转载自1498116590.iteye.com/blog/2412345