Java类装载器小记

类装载器的作用就是将编译后的字节码文件(.class)装入JVM(生成.class文件在内部的组件)。

其工作过程:

1.装载阶段:查找目标文件(.class),并导入该文件。

2.链接阶段:首先验证字节码文件的正确性;校验通过后为静态变量分配内存空间;符号引用解析为直接引用

注解:符号引用为被调用类的类名,直接引用就是类的内存地址)

3.初始化:初始化静态变量、块。

装载阶段的工作由ClassLoader(运行时系统组件)及其子类完成。

虚拟机在运行时产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)

这三者存在层次关系,根装载器是扩展装载器的父类,扩展装载器是系统装载器的父类,这里需要注意的是根装载器是由C++写的,在java中看不到他。

 

其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载Classpath路径下的类包。

此外可由ClassLoader中getParent()方法来查看当前装载器的父类,如果父类为根装载器,返回的结果是 null值。

 

下面介绍JVM装载类的机制:

JVM采用“全盘负责委托机制”,其中 全盘负责 就是一个ClassLoader装载一个类时不仅装载该类同时装载该类的的依赖和引用(除非你显示的使用另外一个ClassLoader来装载)。委托机制 就是 先委托父类装载器来寻找目标类并完成装载工作,如果父类寻找失败,才由当前装载器在自己的类路径寻找目标类并完成装载工作。这么做可以防止出现这样的情况 (有人编写了一个恶意的基础类(如java.lang.String)并装载到JVM中)。

 

posted @ 2017-08-08 14:35  木子归零  阅读(123)  评论(0编辑  收藏  举报