Java虚拟机(三)

类加载器子系统

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虚拟机的途径。
  1. // Four of the methods declared in class java.lang.ClassLoader:  
  2. protected final Class defineClass(String name, byte data[],  
  3.     int offset, int length);  
  4. protected final Class defineClass(String name, byte data[],  
  5.     int offset, int length, ProtectionDomain protectionDomain);  
  6. protected final Class findSystemClass(String name);  
  7. protected final void resolveClass(Class c);  
任何的java虚拟机实现都必须注意将ClassLoader类的这些方法与内部的类加载器子系统连接。


名字空间

每个类加载器都维护着自己的名字空间,用于存放它所加载的类型。当虚拟机需要从一个类中解析到另一个类的符号引用时,就会请求引用类的类加载器来加载被引用类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值