1.JVM的类加载器机制
(1)全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另一个类加载器载入
(2)双亲委派:先让父类加载器视图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
(3)缓存机制:会保证所有加载过的Class都会被缓存,当程序中需要某个Class时,类加载器先从缓存曲中搜寻该Class,只有当缓存区不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换为Class对象存入缓存区中
2.类加载器
作用:通过一个类的全限定名来获取定义此类的二进制字节流,即实现类的加载动作
若要判断JVM中两个类是否为同一个类,则首先必须是同一个类加载器加载的,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要类加载器不同,则这两个类必定不相等
类加载的过程:
将类的class文件读入到内存,并为之创建一个java.lang.Class对象,即程序中使用任何类时,系统都会为其建立一个java.lang.Class对象
在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识
3.双亲委派模型
从Java虚拟机的角度,只存在两种不同的类加载器:
(1)启动类加载器:使用C++语言实现,是虚拟机自身的一部分
(2)所有其他类的加载器:使用Java语言实现,独立于虚拟机外部,且全部继承自java.lang.ClassLoader
从开发者的角度,类加载器又可细分:
(1)启动类加载器
(2)标准扩展类加载器
(3)应用程序类加载器
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应该有自己的父类加载器,而这种父子关系一般通过组合关系来实现,而不是通过继承
具体过程:
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成该加载任务时,才自己去加载
优势:
Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关系可以避免类的重复加载。其次是安全因素,Java核心API中定义类型不会被随意替换