类加载器(ClassLoader)
当编辑器编译java源文件后,会产生以个相对一的字节码文件(.class)
当程序执行开始之前,必须将这个文件载入内存中,生成一个与之匹配的Class对象,
任何以个类加载之后jvm都会为其创建以个唯一的class对象(元对象),再后续都是通过这个Class对象来创建实例,后话(Class对象就是放射的基石。)
这个过程我们称之为类加载
要弄清楚类加载的机制,授信我们必须要清楚了解类加载的相关知识,它是完成整个类加载的重要工具。
简单的说,当有个Class文件载入内存之后,并构建成一个Class对象的过程,就称之为类加载
类加载器(三类)
1,启动类加载器(BootStrap ClassLoader)
启动类加载器是负责加载jdk核心包下的类文件,对应的目录就是“JDK安装目录/jre/lib”。其中最重要的以个jar文件就是rt.jar
注意:这个类加载器我们是没有办法区操作的,因为它本身是用c++语言实现的
2,扩展类加载器(Extension ClassLoader)
这个类加载器,是由启动类加载器来加载的,扩展类加载器是用java语言实现,它主要负责加
载jdk里面的扩展jar文件,对应 目录是"/JDK安装目录/jre/lib/ext"
3,应用程序类加载器(Application ClassLoader)
这个类加载器也是使用java语言实现,它同样由引导类加载器加载。它主要负责加载我们开发人员说明编写的java类,通常对应的目录就是环境变量下的ClassPath路径
双亲委托模型
jvm的类加载时基于双亲委托模型,也就是当我们编写一个任意类的时候,本身不是由应用程序加载器立即加载,而是先委托给夫加载器,当夫加载器再自己说明加载的范围内找不到相对应的class文件时,最后才会将加载权交回给子加载器区加载,这样做的目的是为了保证jvm的安全机制
双亲委托模型的工作流程:
如果以个类加载器收到类加载的请求,它首先不会自己先尝试加载这个类,而是把请求委托给父类加载器去完成,依次向上,因此,所有的类加载器请求最终都应该被传递到顶层的启动类的加载器中,只有当父加载器在它的搜索范围中没有找到所需要的类时,即无法完成该加载,子加载器才会尝试自己去加载类