在Java虚拟机中,存在着多个类装载器,称为类装载器子系统。
一个Java程序可以使用两种类装载器,启动类装载器和用户定义的类装载器。
启动类装载器是Java虚拟机实现的一部分,使用默认方式从本地磁盘装载类。用户定义的类装载器是一个普通的Java对象,是在运行时创建的,可以使用自定义的方式装载类。用户定义的类装载器,使得在运行时扩展Java应用程序成为可能。
每一个类被装载的时候,Java虚拟机都监视这个类,看它到底是被启动装载器还是被用户定义的类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。
一个Java程序可以创建多个用户定义的类装载器,每一个类装载器都有它自己的命名空间,被不同的类装载器装载的类,存放在不同的命名空间中。
双亲委派模式:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传递到顶层的启动类加载器中。只有当父类加载器反馈自己无法完成这个请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
运行时包:指的是由同一个类装载器装载的,属于同一个包的,多个类型的集合。
在两个类型之间对包内可见的成员进行访问时,虚拟机不但要确定这两个类型属于同一个包,还必须确认它们属于同一个运行时包——由同一个类装载器装载的。