zoukankan      html  css  js  c++  java
  • 《程序员修炼之道》-读书笔记八-类加载和类对象

    一. 类的加载和连接预览

      JVM的目的是使用类文件并执行其中的字节码。要实现这个目的,JVM必须以字节数据流的方式取出类文件中的内容,并将其转换成可用的格式加人运行态中。这个分两步走的过程被称为加载和连接,但连接又会被分解为几个子阶段。

      加载

      这个过程首先要读取构成类文件的字节数据流并给类的表现形式解冻。该过程一开始是创建一个字节数组,其内容通常是从文件系统中读取的,然后产生与所加载的类对应的Class对象。

      在这个过程中会对类做一些基本检查,但在加载过程结束时,Class对象还不成熟,所以类也不可用。

      连接

      加载完成之后,类必须被连接起来。这一步骤分为三个子阶段一一一验证,准备和解析。验证阶段证实类文件符合预期,不会引起系统的运行时错误或其他问题。之后是类的准备阶段,在类文件中引用的其他类型全部都要定位到,以确保该类已准备就绪,连接步骤中各子阶段之间的相互关系如图所示:

    验证

      验证是一个非常复杂的过程,它分为几个步骤。
      首先是完整性检查。这实际上是加载过程中的一部分,会确保类文件格式良好,可以连接。
      接着是检查常量池中的符号信息是自相一致的,并要遵守常量的基本行为准则。其他不涉及代码的静态检查也要在这一阶段完成,比如检查final方法有没有被重写。
      之后是验证中最复杂的部分一一方法的字节码检查。要检查字节码行为良好,并且不会试图摆脱VM的环境控制。下面是一些主要检查。

    • 是否所有方法都遵守访问控制关键字的限定。
    • 方法调用的参数个数和静态类型是否正确
    • 确保字节码不会试图滥用堆栈。
    • 确保变量使用之前被正确初始化了。
    • 检查变量是否仅被赋予恰当类型的值。

      做这些检查是出于性能方面的考虑,这样可以加快解释码的运行速度,运行时就不用再做这些检查了。同时还简化了运行时把字节码编译为机器码的过程(即时编译)。

      准备

      类的准备包括分配内存和准备好初始化类中的静态变量,但不会现在初始化变量,也不会执行任何VM字节码。

      解析

      解析会促使VM检查类文件中所引用的类型是不是都是已知的类型。如果有运行时未知的类型,那它们也需要被加载进来。这些可见的未知类型会再次引发类加载过程。
      一旦需要加载的其他类型全被定位并解析完成,VM就可以初始化那个最初要加载的类。这时所有静态变量都可以被初始化,所有静态初始化代码块都会运行。现在你运行的字节码就是来自新加载进来的类里的。这一步完成之后,类的加载就已全部完成,类也就可以使用了。

    二. 类加载器

      Java平台里有几个经典的类加载器,它们在平台的启动和常规操作过程中承担不同的任务:

    • 根(或引导)类加载器一一通常在VM启动后不久实例化,一般用本地代码实现。最好把它看做VM的一部分。它的作用通常是负责加载系统的基础JAR(主要是rt.jar),而且它不做验证工作。
    • 扩展类加载器一一用来加载安装时自带的标准扩展。一般包括安全性扩展。
    • 应用(或系统)类加载器一一这是应用最广泛的类加载器。它负责加载应用类。在大多数SE(Java标准版)的环境中,主要工作都是由它来完成。
    • 定制类加载器一一在更复杂的环境中,比如EE(Java企业版)或比较复杂的SE框架,通常会有些附加(即定制)的类加载器。有些团队甚至为他们的某个应用程序编写了特定的类加载器。

      除了核心任务,类加载器还经常要从JAR文件或classpath中加载资源(不是类文件,比如图片或配置文件)。

      有些框架和代码还经常会使用带有额外属性的专用(甚至用户自定义的)类加载器。这些类加载器经常会在加载时对字节码进行转换。
      下图是类加载器的继承层级以及不同加载器之间的相互关系。

     

       这其中涉及到了双亲委派机制,双亲委派模式要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,请注意双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来复用父类加载器的相关代码

      当一个类加载器收到了类加载请求时,会先把这个请求委托给父类加载器去执行,如果这个父类加载器上边还有加载器,则继续向上委托,直到到达顶层的启动类加载器.如果父类可以执行成功,则直接返回结果,如果父类无法加载,则再让子类去尝试加载.

  • 相关阅读:
    一个常见数据库操作错误的分析(四)
    一个常见数据库操作错误的分析(六)
    vc6 配置使用 boost 1.34.1
    string tips
    greta 编译,配置,使用
    xml学习笔记(一)
    火狐插件Firebug的使用
    浅谈编写高性能的Javascript代码 【重要】
    WebConfig加密/解密
    微软发布3款SQL Injection(SQL 注入)攻击检测工具
  • 原文地址:https://www.cnblogs.com/Deters/p/11806099.html
Copyright © 2011-2022 走看看