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

Java虚拟机(三)

2014-04-03 15:49 190 查看

类加载器子系统

Java虚拟机实现中负责查找和加载类型的部分是类加载器子系统。java虚拟机包含两种类型的类加载器:bootstrap类加载器和user-defined类加载器。bootstrap类加载器是java虚拟机实现的一部分,而user-defind类加载器属于正在运行的java程序的一部分,不同的类加载器加载的classes被放置到各自的名字空间里。

user-defined类加载器是java.lang.ClassLoader派生类的对象。ClassLoader类的方法允许java程序访问虚拟机的类加载机制。另外,对于每一个java虚拟机加载的类型,都会创建一个java.lang.Class类的实例来表示那个类型。跟所有的对象一样,user-defined类加载器和Class类实例都是是存储在堆中的。而被加载类型的数据则存储在方法区里。

加载,链接和初始化

类加载器子系统不仅需要负责定位和导入类的二进制数据,它还必须验证导入类的正确性,为类变量分配和初始化内存,和协助解析符号引用。这些活动必须按照严格的顺序执行:

1. 加载:查找和导入类型的二进制数据

2. 链接:执行验证,准备和解析(可选择)

a.验证:保证导入类型的正确性
b.准备:为类变量分配内存并初始化成默认值
c.解析:将符号引用转化成类型的直接引用

3. 初始化:调用java代码将类变量初始化成正确的初始值

Bootstrap类加载器

java虚拟机实现必须能够识别并加载存储在class文件中的class和interface。每个java虚拟机实现都有一个bootstrap类加载器,它知道如何加载一个可信的类,包括Java API里面的类。给定一个全限定名,bootstrap类加载器必须尝试以某种方式产生定义该类型的数据。java虚拟机实现中的一个常用的方法是,搜索一个用户定义目录的路径,这个路径存储在一个名字为CLASSPATH的环境变量中。bootstrap类加载器按CLASSPATH中的目录顺序搜索每一个目录,知道它找到一个名字匹配的文件(类型的简单名字加".class")。

User-Defined类加载器

虽然user-defined类加载器本身是java程序的一部分,但是在ClassLoader类中,有4个方法作为进入java虚拟机的途径。
// Four of the methods declared in class java.lang.ClassLoader:
protected final Class defineClass(String name, byte data[],
int offset, int length);
protected final Class defineClass(String name, byte data[],
int offset, int length, ProtectionDomain protectionDomain);
protected final Class findSystemClass(String name);
protected final void resolveClass(Class c);
任何的java虚拟机实现都必须注意将ClassLoader类的这些方法与内部的类加载器子系统连接。

名字空间

每个类加载器都维护着自己的名字空间,用于存放它所加载的类型。当虚拟机需要从一个类中解析到另一个类的符号引用时,就会请求引用类的类加载器来加载被引用类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: