关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java常量池解析与字符串intern简单介绍

    Java常量池解析与字符串intern简单介绍

    2015-11-15 00:00:00 出处:ImportNew
    分享

    在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构。 关于class文件常量池的部分可以参考之前的博文实例探索Class文件。

    1.CONSTANT_Class入口解析

    数组类的符号解析较为特殊。若是基本类型数组,那么虚拟机将创建该基本类型的新数组类,并创建一个Class实例来代表该类型,数组类的定义类加载器为 启动类加载器。若是引用类型的数组,那么在此之前还会进行引用类型的解析,数组类的定义类加载器为引用类型的定义类加载器。

    非数组类和接口的的解析将经历以下步骤:

    (1).加载该类型和其所有的超类型

    如果该类型在此之前已经装载到了虚拟机的当前命名空间,那么直接使用已经被装载的类型即可,否则由引用的发起类的初始类加载器进行加载。对目标类型的超类的加载必然是在对当前类型加载完的基础上进行的,因为只有加载完当前类型,才能从class文件的super_class域找到其直接超类的符号引用,再递归进行解析和加载,直至java.lang.Object类。而在递归返回的过程中,会检查interfaces域以查看实现或扩展了哪些接口,并再次递归遍历对接口的符号引用。

    (2).检查访问权限

    随后是对目标类型的连接和初始化,这样才可以正常使用该类型。前面提到,对目标类型的初始化需要其所有超类都必须进行初始化(超接口不是必须的),并且,由于已经对其超类进行了加载,所以不必再依赖于自该类向Object类的解析顺序,而是从Object类向该类进行初始化。类型的连接和初始化步骤如下:

    (3).类型校验

    (4).类型准备

    (5).类型解析(可推迟)

    注意该过程是对被引用类型及其超类的符号引用的解析,因为对于被引用类型的某些符号引用不会立刻用到,故该步骤之前是严格意义上属于发起引用的类型的符号 解析的过程。只有在主动使用被引用类型的这些符号引用所指向的类型时,才会对这些符号引用进行解析,对其所指向的类型进行装载、连接和初始化。

    (6).类型初始化

    2.CONSTANT_Fieldref入口解析

    由于一个类型不会含有其超类型所定义的字段,所以对目标字段的搜索将会从字段所 指向的类型开始,从该类型开始搜索,再递归搜索其所实现或扩展的接口,再递归搜索其超类,直至找到目标字段,并会将运行时常量池的该字段入口标记为已解 析,并在该常量池的数据上改为对这个字段的直接引用。

    3.CONSTANT_Methodref入口解析

    与字段的搜索类似但有所不同,其搜索顺序将从该类型开始,再递归搜索其超类,在递归搜索其所实现或扩展的接口。

    4.CONSTANT_InterfaceMethodRef入口解析

    对接口方法的搜索就是从被解析的接口开始,向其超接口递归搜索。

    5.CONSTANT_String入口解析

    Java虚拟机会将字符串处理为一个字符串对象加以维护,而虚拟机所维护的就是一张 字符串池,它包含所有被”拘留”的字符串对象的引用。对CONSTANT_String常量池的解析首先就要查看字符串池中该字符串对象的引用是否存在, 如果存在则直接把常量池数据解析为该字符串对象的引用,若不存在,那么就需要根据这个字符串序列创建一个字符串对象,并将其引用加入到字符串池中,并将常 量池数据解析为该引用。

    也可以使用String对象的intern对象来拘留一个字符串(注意并非字符串对象),若该字符串池中存在对该字 符串序列的对象的引用,那么直接返回该引用即可,否则,将会拘留该字符串,但注意拘留返回的字符串对象引用将不会指向原String对象,因为原 String对象位于Java堆,而字符串池的对象是虚拟机所创建的,由虚拟机所维护。

    package com.ice.intern;
    
    public class InternTest {
    
        public static void main(String args[]){
            String a = new String("123");
            String b = a;
            String c = new String("123");;
    
            System.out.println("before intern:");
            System.out.println("a = b   :" + (a == b));
            System.out.println("a = c   :" + (a == c));
    
            a = a.intern();
            c = c.intern();
    
            System.out.println("after intern:");
            System.out.println("a = b   :" + (a == b));
            System.out.println("a = c   :" + (a == c));
        }
    
    }

    结果如下:

    Java常量池解析与字符串intern简介

    (6).其他类型(数据基本类型)入口解析

    直接使用常量池所包含的常量值即可

    6.直接引用

    常量池解析最终将符号引用替换成为直接引用。指向类型、类变量和类方法的直接引用可能为在方法区的指针。而指向实例变量和实例方法的直接引用是从对象映像的开始到该实例变量或方法表的偏移。

    实例变量的组织方式为:从Object类开始到该实例的类型,将类中声明的实例变量按在class文件中出现的顺序依次放在对象映像中。
    实例方法的组织方式较为类似:从Object类开始到该实例的类型,将类中声明的实例方法指针按在class文件中出现的顺序依次放在对象映像中。但对于重写的方法将出现在超类对应的位置(该方法第一次出现的位置)。

    但是访问接口方法就不能简单地通过方法表的偏移量来进行访问,而必须搜索对象的类的方法表来找到该方法。

    比如Factory接口分别由A和B来实现其produce()方法,但由于A和B不能保证由同一个实现了Factory接口的超类派生,即有着同样的produce()方法偏移,那么就无法通过方法表的偏移来访问Factory的produce()方法。

    7.装载约束

    对于一个类型指向另一个类型的符号引用,如果引用的类型和被引用类型并非由同一个初始加载器加载(可能通过用户自定 义ClassLoader来实现),那么虚拟机就必须确保被引用类型在不同的命名空间中保持一致。这样就通过自定义ClassLoader来加载不受信类 型后,就不会发生解析对被引用类型的符号引用时,把受信的类型当做已经被解析过的不受信类型(因为对方法的符号引用只有权限定名和描述符,并不会也无法得 知其初始类加载器),从而调用了不受信类型的方法访问受信类型的受保护成员。

    Java常量池解析与字符串intern简介

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。