您的位置:首页 > 编程语言 > Java开发

java 虚拟机类装载器(classloader)的工作机制

2013-07-23 14:25 288 查看
类装载器就是寻找类的节码文件并构造出类在 JVM内部表示对象的组件 。在 Java 中,

类装载器把一个类装入 JVM 中,要经过以下步骤:

1.装载:查找和导入 Class文件;

2.链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:

a)校验:检查载入 Class文件数据的正确性;

b)准备:给类的静态变量分配存储空间;

c)解析:将符号引用转成直接引用;

3.初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作由 ClassLoader 及其子类负责,ClassLoader 是一个重要的 Java 运行时系统

组件,它负责在运行时查找和装入Class 字节码文件。JVM 在运行时会产生三个

ClassLoader :根装载器、ExtClassLoader(扩展类装载器)和 AppClassLoader(系统类装载

器)。其中,根装载器不是ClassLoader 的子类,它使用 C++ 编写,因此我们在 Java 中看不

到它,根装载器负责装载JRE 的核心类库,如JRE 目标下的rt.jar 、charsets.jar 等。

ExtClassLoader和AppClassLoader 都是ClassLoader 的子类。其中ExtClassLoader负责装载

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

这三个类装载器之间存在父子层级关系,即根装载器是 ExtClassLoader的父装载器,

ExtClassLoader是AppClassLoader 的父装载器

JVM装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个 ClassLoader 装载

一个类的时,除非显式地使用另一个ClassLoader ,该类所依赖及引用的类也由这个

ClassLoader 载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下

才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写

了一个恶意的基础类(如 java.lang.String)并装载到 JVM中将会引起多么可怕的后果。但

是由于有了“全盘负责委托机制”,java.lang.String 永远是由根装载器来装载的,这样就避

免了上述事件的发生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: