类的加载和连接过程

类是平台能加载的最小程序代码单元,要将新的类加入到jvm的当前运行状态中,以下操作会被执行。首先,类文件必须被加载进来并连接,而且必须进行大量的验证。之后会提供一个代表该类的新class对象给正在运行的系统,并可以创建新的实例。

类的加载和连接

加载过程首先要读取构成类文件的字节流并给类的表现形式解冻。该过程一开始是创建一个字节数组,其内容通常是从文件系统中读取的,然后产生与加载的类对应的class对象。在这个过程中会对类做一些基本的检查,但在加载过程结束时,class对象还不成熟,所以类不可用。

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

验证是一个非常复杂的过程,分为一下几个阶段:首先是完整性检查。这实际是类加载过程中的一部分,会确保类文件格式良好,可以连接。接着是检查常量池中的符号信息是自相一致的,并要遵守常量的行为准测。其他不涉及代码的静态检查也在这一阶段完成,比如检查final方法是否被重写。之后是验证最复杂的部分——方法的字节码检查。要检查字节码行为良好并且不会试图摆脱VM的环境控制,一下是一些主要检查。是否所有方法都遵守访问控制关键字的限定;方法调用的参数个数和静态类型是否正确;确保字节码不会试图滥用堆栈;确保变量使用之前被正常初始化;检查变量是否被赋予恰当类型的值。

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

类的解析阶段会促使VM检查类文件中所引用的类型是不是都是已知的类型。如果有运行时未知的类,那它们也会被加载进来。

一旦需要加载的其他类型全被定为并且解析完成,VM就可以初始化那个最初要加载的类。这时所有的静态变量都可以被初始化,所有静态初始化代码快都会运行。这一步完成后,类的加载全部完成,类也就可以使用了。

类的加载和连接过程如图:

其实个人认为,类加载的过程就好比一个企业招聘的流程,首先,加载过程就相等于把企业招聘信息扩散出去,然后就有简历进来,然后企业就开始看简历,这差不多就像一个加载过程。被“加载”进来的简历,当然需要通过企业的面试阶段,来检查面试的对象是否符合企业的要求,这相当于连接过程的验证阶段。通过企业的验证后,发放了offer,然后企业就会着手准备给提供了offer员工的上班环境,给他分配好工作空间,工作时间和工作要求等,之后就可以召唤员工来上班了,公司就又多了一个员工。

注:参考资料《java程序员修炼之道》

时间: 2024-10-11 07:27:42

类的加载和连接过程的相关文章

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

深入java虚拟机(二)——类的生命周期(上)类的加载和连接

类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象.实际的情况可能

类的加载机制和反射——一、类的加载、连接和初始化

类的加载.连接和初始化 1.JVM和类 (1)当调用java命令运行某个Java程序时,该命令会启动一个Java虚拟机进程,不管该Java程序有多么复杂,该程序启动了多少线程,他们都处于该Java虚拟机进程里. (2)同一个JVM的所有线程.所有变量都处于同一个进程里,他们都使用该JVM进程的内存区. 下面的ATast1和ATest2的输出结果分别是7和6,因为这两个不是位于同一个JVM中的. public class A { //定义该类的类变量 public static int a = 6

java 类的加载、连接和初始化

JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区.当系统出现以下几种情况时,JVM进程将被终止: 程序运行到最后正常结束: 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序: 程序运行过程中遇到未捕获的异常或错误而结束: 程序所在的平台强制结束了JVM进程. 类的加载 当程序主动使用某个类时,

java中的类的加载、连接、初始化

同一类的所有实例的静态变量共享用一块内存区. 但两个jvm之间并不会共享数据.类被加载之后,系统为之生成一个对应的class对象. 1.类的加载 将类的class文件读入内存,并创建class对象. 2.连接 连接的过程分为三步: (1)验证 被加载的类的内部结构是否正确.协调. (2)准备 为类变量分配内存并设置默认初始值. (3)解析 将类的二进制数据中的符号引用替换成直接引用. 3.初始化 虚拟机负责对类进行初始化,主要对类变量进行初始化. 1.声明类变量时指定初始值. 2.使用静态初始化

(二十六)类加载机制和类的加载、连接(验证、准备、解析)和初始化

一.概念 在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制. Class文件中的"类"从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段.类加载机制包括了前五个阶段. 如下图所示: 其中,加载.验证.准备.初始化.卸载的开始顺序是确定的,注意,

类的加载、连接和初始化

系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类.本节将会详细介绍类加载.连接和初始化过程中的每个细节. JVM 和类 当调用 java 命令运行某个 Java 程序时,该命令将会启动一个 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程里.正如前面介绍的,同一个 JVM 的所有线程.所有变量都处于同一个进程里,它们都使用该 JVM 进程的内存区.当系统出现以下几种情况时,JVM 进程将被终止. 程序运行到最

JVM 1.类的加载、连接、初始化

Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用来描述该类,再在方法区存放这些二进制数据,用来保存类对应的数据结构 Java的类加载器有哪些? 下面的String对象是由bootstrap根类加载器加载的,而自定义类C是由系统加载器加载的: /** * 源文档中这样描述: * Some implementations may use null t

jvm讲解一:类的加载、连接和初始化

类的加载: 类的加载是指将类的class文件读入内存中,并为之创建一个java.lang.Class对象,也就是当程序使用任何类是,系统都会为之建立一个java.lang.Class对象(也可以说类是java.lang.Class的实例,详情请百度‘java.lang.Class’) 类的加载使用类加载器完成,JVM提供了几种类加载器以完成类的加载.除此之外,开发者可以通过继承ClassLoader来创建自己的类加载器. 通常可以使用不同的类加载器从不同的来源加载类的二进制数据:   从本地文件