类加载器
本文最后更新于:3 年前
类加载器
作用:加载Class文件。
加载是将类的class文件读入到内存,并为之创建一个java.lang.Class对象。
加载器的类型
启动类加载器BootstrapClassLoader:
是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,启动类加载器无法被应用程序直接使用。
扩展类加载器Extension ClassLoader:
该加载器器是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。开发者可以这几使用扩展类加载器。
系统类加载器App ClassLoader:
系统类加载器,也称为应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。
注意:
类加载器的体系并不是“继承”体系,而是委派体系,大多数类加载器首先会到自己的parent中查找类或者资源,如果找不到才会到自己本地查找。类加载器的委托行为动机是为了避免相同的类被加载多次。
类加载的过程
加载:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个Class对象
链接
- 验证:验证被加载的类的正确性 。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
- 准备:为类的静态变量分配内存,并将其初始化为默认值 。
- 解析:把类中的符号引用转换为直接引用 。
初始化:为类的静态变量赋予正确的初始值。
双亲委派机制
工作原理:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,
优势
- 类加载器使得Java类一起具备了带有优先级的层次关系,可以避免类的重复加载(当父亲已经加载了该类时,就没有必要子、ClassLoader再加载一次)
- 更加安全,java核心api中定义类型不会被随意替换。
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!