类加载器
类加载器的作用
类加载器实现类的加载动作,同时用于确定一个类。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。即使两个类来源于同一个Class文件,只要加载它们的类加载器不同,这两个类就不相等。
类加载器有哪些
启动类加载器
(Bootstrap ClassLoader):使用C++实现(仅限于HotSpot),是虚拟机自身的一部分。负责将存放在\lib目录中的类库
加载到虚拟机中。其无法被Java程序直接引用;扩展类加载器
(Extention ClassLoader):由ExtClassLoader实现,负责加载\lib\ext目录中的所有类库
,开发者可以直接使用;应用程序类加载器
(Application ClassLoader):由APPClassLoader实现。负责加载用户类路径(ClassPath)上所指定的类库
;
类加载机制
什么是类加载机制
Class文件描述的各种信息,都需要加载到虚拟机
后才能运行。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
什么是双亲委派模型
双亲委派模型(Parents Delegation Model)要求除了顶层的启动类加载器外,其余加载器都应当有自己的父类加载器
。类加载器之间的父子关系,通过组合关系复用。
工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器
完成。每个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有到父类加载器反馈自己无法完成这个加载请求(它的搜索范围没有找到所需的类)时,子类加载器才会尝试自己去加载。
为什么要使用双亲委派模型,组织类加载器之间的关系
Java类随着它的类加载器一起具备了一种带优先级的层次关系。比如java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此Object类载程序的各个类加载器环境中,都是同一个类。
如果没有使用双亲委派模型,让各个类加载器自己去加载,那么Java类型体系中最基础的行为也得不到保障,应用程序会变得一片混乱。