iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解析Java常量池与字符串intern
  • 358
分享到

如何解析Java常量池与字符串intern

2023-06-17 05:06:33 358人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关如何解析Java常量池与字符串intern,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于cl

这期内容当中小编将会给大家带来有关如何解析Java常量池与字符串intern,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于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

上述就是小编为大家分享的如何解析Java常量池与字符串intern了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何解析Java常量池与字符串intern

本文链接: https://www.lsjlt.com/news/287277.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解析Java常量池与字符串intern
    这期内容当中小编将会给大家带来有关如何解析Java常量池与字符串intern,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于cl...
    99+
    2023-06-17
  • JVM字符串常量池及String的intern方法实例分析
    本文小编为大家详细介绍“JVM字符串常量池及String的intern方法实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JVM字符串常量池及String的intern方法实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-27
  • Java字符串常量池示例详解
    为什么会有常量池的概念? 不知道小伙伴们是否有思考过这个问题? 没有思考也无所谓,小编在这里类比一下,大家就会清晰了。什么是池? 我们听的最多的池,应该是数据...
    99+
    2024-04-02
  • Java String类的理解及字符串常量池介绍
    目录一. String类简介1. 介绍2. 字符串构造二. 字符串常量池(StringTable)1. 思考?2. 介绍和分析3. intern方法三. 面试题:String类中两种...
    99+
    2024-04-02
  • Java怎么清除常量池中的字符串
    在Java中,无法直接清除常量池中的字符串。因为字符串常量池是一个特殊的内存区域,用于存储编译时期的字符串常量,它的内容是不可变的。...
    99+
    2024-02-29
    Java
  • Java字符串常量池的作用是什么
    这篇文章将为大家详细讲解有关Java字符串常量池的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么会有常量池的概念不知道小伙伴们是否有思考过这个问题 没有思考也无所谓,小编在这...
    99+
    2023-06-20
  • Java中常量字符串过长如何解决
    今天就跟大家聊聊有关Java中常量字符串过长如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。解决办法使用StringBuilderStringBuilder sb&n...
    99+
    2023-06-14
  • 一文带你了解如何正确使用Java中的字符串常量池
    目录前言理解字符串常量池两种创建字符串方式字符串拼接方式妙用String.intern() 方法字符串常量池有多大字符串常量池的优缺点总结前言 研究表明,Java堆中对象占据最大比重...
    99+
    2022-12-26
    Java字符串常量池使用 Java字符串常量池
  • JAVA中字符串常量池和缓冲池的作用是什么
    这篇“JAVA中字符串常量池和缓冲池的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JAVA中字符串常量池和缓冲池...
    99+
    2023-06-29
  • JAVA中的字符串常量池使用操作代码
    目录前言理解字符串常量池字符串拼接方式妙用String.intern() 方法字符串常量池有多大?字符串常量池的优缺点字符串池的优点字符串池的缺点总结前言 研究表明,Java堆中对象...
    99+
    2022-12-27
    java字符串常量池 java常量池
  • C语言的变量与常量 字符字符串与转义字符详解
    目录一.变量1.1定义变量的方法1.2变量的分类1.3变量的使用二.常量2.1字面常量 2.2 const修饰的常变量 2.3#define定义的标识符常量2.4...
    99+
    2024-04-02
  • Java字符串的intern方法有何奥妙之处
    学习背景 进入正文学习字符串的intern()方法之前,先给下这4个问题,看下自己是否都知道答案? 1、String s1 = “a” + “b”; //创建了几个对象? 2、St...
    99+
    2024-04-02
  • java未结束的字符串常量问题如何解决
    在Java中,字符串常量是由双引号括起来的字符序列。如果字符串常量没有正确地终止,即缺少了终止的双引号,就会导致编译错误。 要解决这...
    99+
    2024-02-29
    java
  • php如何解析字符串
    在php中使用parse_str()函数对字符串进行解析,具体方法如下:parse_str()函数作用:php中parse_str()函数的作用是用于将一个字符串解析到变量中。parse_str()函数语法:parse_str(string...
    99+
    2024-04-02
  • Java 常量字符串过长的解决方法
    问题出现 在IDEA中,字符串长度超过65535,进行打印,IDEA会提示java: 常量字符串过长。使用javac 进行编译也会有类似的提示 解决办法 使用StringBuil...
    99+
    2024-04-02
  • 深入解析Go 变量字符串与字符编码问题
    目录字符串Unicode UTF8常⽤字符串函数字符串就是一串固定长度的字符连接起来的字符序列(很多字符拼接在一起的)。 Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使...
    99+
    2024-04-02
  • 怎么解析C语言的常量和字符串
    怎么解析C语言的常量和字符串,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。常量种类C语言中,我们常使用的常量有以下几种:字面常量const常变量#define定...
    99+
    2023-06-22
  • Scala如何解析Json字符串
    小编给大家分享一下Scala如何解析Json字符串,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Scala解析Json字符串的实...
    99+
    2024-04-02
  • jquery如何解析json字符串
    在jquery中解析json字符串的方法:1.新建html项目,引入jquery;2.定义json字符串;3.使用parseJSON、JSON.parse、eval函数解析json字符串;具体步骤如下:首先,在新建一个html项目,在项目中...
    99+
    2024-04-02
  • mysql如何解析json字符串
    mysql中解析json字符串的方法使用JSON_EXTRACT()函数解析json字符串 语法:JSON_EXTRACT(原字段,'$.json字段名')示例:SELECT JSON_EXTRACT( t.result,'$.ro...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作