【Java学习笔记】类的加载器

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1.作用:

用来把类加载到JVM虚拟机。

2.加载过程特征:

当请求加载器loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若父加载器不能加载则loader1本身去加载。这样可以保证Java平台的安全。

3.种类:

a)根(Bootstrap)加载器:该加载器没有父加载器,负责加载虚拟机的核心类库。其实现依赖于底层的操作系统,属于虚拟机实现的一部分。

b)扩展(Extension)类加载器:其父加载器为根类加载器,负责从java.ext.dirs系统属性所指定的目录中加载类,或者从JDK安装目录的jre/liv/ext子目录下加载类库。其是纯Java类,是java.lang.Classloader的子类。

c)系统(System)类加载器:也称为应用类加载器,它的父加载器为扩展类加载器,负责从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义类的默认父加载器。其是纯Java类,是java.lang.Classloader的子类。

4.具体加载过程: Class sampleClass = loader2.loadClass(“sample”);

loader2首先从自己的命名空间中查找Sample类是否已经被加载,若已经加载,就直接返回代表Sample类的Class对象的引用。若没有加载,loader2会一步步向上请求各级父加载器加载直到顶端,然后层层返回加载是否成功的讯息,若没有一处成功的,则抛出ClassNotFound异常。若有一个类加载器能成功加载,那么称其为定义类加载器,所有能成功返回Class对象的引用的类加载器(包含定义类加载器)都称为初始类加载器。

注意:加载器之间的父子关系不是指继承,而是加载器对象之间的包装关系。一对父子类加载器可能是同一加载类的两个实例,例如:

ClassLoader loader1 = new MyClassLoader();

ClassLoader loader2 = new MyClassLoader(loader1);//参数loader1作为loader2的父加载器

5.命名空间的定义:

每个类的加载器都有自己的命名空间,其是由该加载器及所有父类加载器所加载的类组成。

6.运行时包:

由同一类加载器加载的属于相同包的类组成了运行的包,决定两个类是不是属于同一运行时包,不仅看其包名是否相同,还要看定义类加载器是否相同。

7.创建自定义的类加载器

通过扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定的类的名字,返回对应的Class对象的引用。具体的可以参考http://blog.csdn.net/assre/archive/2006/01/18/583398.aspx

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

原文地址:https://www.cnblogs.com/gnuhpc/p/2843679.html