类加载机制 末蓝、 2022-12-25 15:54 211阅读 0赞 一、类加载的几个阶段 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70] ## 1、初始化的条件 ## 以下五种情形会触发类的初始化 1、通过new关键字创建对象 调用类的静态属性(读取、设置等) 2、反射 3、初始化一个类,但父类还没有初始化,要先初始化父类 4、应用程序主类,main方法的类 5、动态语言支持 static final 在编译(准备阶段)的时候就已经确定了,已经编译到各个引用类中了 因为在编译时Javac将会为被static和final修改的常量生成ConstantValue属性 ### 加载阶段 ### 虚拟机需要完成以下3件事情: 1)通过一个类的全限定名来获取定义此类的二进制字节流。 2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 ### 验证 ### 是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。但从整体上看,验证阶段大致上会完成下面4个阶段的检验动作:文件格式验证、元数据验证、字节码验证、符号引用验证。 ### 准备阶段 ### 是正式为类变量分配内存并设置类变量初始值的阶段。注意是**类变量**的赋值,即静态变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。而且这里的赋值是默认值,如int类型的0 但假设上面类变量value的定义变为:public static final int value=123; 编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123。 ### 解析阶段 ### 是虚拟机将常量池内的符号引用替换为直接引用的过程 符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可 直接引用:可以是直接指向目标的指针,相对偏移量,一个能间接定位到目标的句柄,使用直接引用时,引用的目标必定已经存在于虚拟机的内存中了 ### 类初始化阶段 ### 程序员真正可以操作的阶段,前面除了加载阶段可以自定义类加载器操作外,其他都是虚拟机主导和控制。变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源 初始化阶段是执行类构造器<clinit>()方法的过程。<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static\{\}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的。 **<clinit>方法** < clinit > 方法是类的初始化方法,而< init > 方法是对象的初始化方法, < clinit > 方法只会在类需要被加载时,才会被调用到,除非类被卸载了,不然一般只会被调用一次,而< init > 方法则是只要有初始化对象的操作(除了反序列化和使用 Object 的 clone 方法),就会被调用 <clinit>()方法对于类或接口来说并不是必需的,如果一个类中没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为这个类生成<clinit>()方法。 # 类加载器 # ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70 1] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70 2] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70 3] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70]: /images/20221120/bbf7ecdedf4d4600b5ad7e5f7b13df6f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70 1]: /images/20221120/370fa9968f91447688aee2a05d1a0c29.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70 2]: /images/20221120/08d85dd768e34961be3f3bd5df7d2d40.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzAwMDMw_size_16_color_FFFFFF_t_70 3]: /images/20221120/ff6d4cecb43841269fdf55bbdb39f439.png
相关 类加载机制 1.类加载流程 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG 骑猪看日落/ 2022年12月26日 10:26/ 0 赞/ 191 阅读
相关 类加载机制 一、类加载的几个阶段 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9i 末蓝、/ 2022年12月25日 15:54/ 0 赞/ 212 阅读
相关 类加载机制 点击上方“晏霖”,选择“置顶或者星标” 曾经有人关注了我 后来他有了女朋友 1.6类加载机制 1.6.1概述 学习本章前我们要对类文件结构有一个简单的认识,而学 迷南。/ 2022年12月22日 11:16/ 0 赞/ 205 阅读
相关 类加载机制 我们都知道java中比较常提到的一个概念就是类。但是在java机制中,类是怎么运行的呢?下面来看看L: 类被加载到虚拟机到使用,最后被卸载,经历了一下几个步骤: ╰+哭是因爲堅強的太久メ/ 2022年07月13日 09:10/ 0 赞/ 277 阅读
相关 类加载机制 类加载器层次是怎么样的 1. JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 `<J - 日理万妓/ 2022年07月12日 07:15/ 0 赞/ 299 阅读
相关 类加载机制 类加载器层次是怎么样的 1. JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 `<J Bertha 。/ 2022年07月12日 07:15/ 0 赞/ 244 阅读
相关 类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、 转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 待我称王封你为后i/ 2022年07月12日 05:59/ 0 赞/ 284 阅读
相关 类加载机制 任何一个类在使用前都要经历过完整的加载,连接和初始化三个类加载步骤。经历过这三个步骤之后类型就能随时随地被使用了。从一个类型被加载进JVM算起,直至最终被卸载出内存为止,它的整 左手的ㄟ右手/ 2022年06月10日 06:47/ 0 赞/ 330 阅读
相关 类加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个`java.lang.Class`对 骑猪看日落/ 2022年05月27日 05:08/ 0 赞/ 323 阅读
相关 类加载机制 java类加载的全过程包含5个步骤: 加载,验证,准备,解析,初始化 而验证,准备,解析又可以合并为一个阶段:连接 怼烎@/ 2021年10月01日 08:26/ 0 赞/ 454 阅读
还没有评论,来说两句吧...