class文件的加载过程(真正理解class文件的常量池)
class文件的加载过程(真正理解class文件的常量池)
2024-09-27 08:07:29  作者:志在千里  网址:https://m.xinb2b.cn/sport/vjg505419.html

class文件常量池可以说是class的资源库,可以说它包含所有class文件需要的字符

再看class文件结构

再次引入class文件结构图如下图:


在上一篇文章中分析了class文件的前三个结构magic、minor_version、major_version,这三个结构除了主版本跟随jdk版本变化外其他都是固定不变的,是class文件的的基础。

紧接着的结构是constant_ pool_count、constant_ pool常量池数量与常量池,常量池数量u2类型的结构,暂用两个字节,里面的内容表示接下来会有多少个常量。

constant_ pool可以把他想成一个数组,他的长度是constant_ pool_count-1,因为constant_ pool是从1开始计数的,第0项作为预留可以表示什么都没有的意思,比如后面有索引要指向常量池的数据,但是实际值是不存在,则可以指向0(写在这里可能难以理解,不过等看完这篇文章在回头来看应该就理解了)。

常量池数据结构

前面的结构通过固定暂用几个字节就表达需要表达的含义,而接下来的常量池则要表达的内容要多得多,所以不是仅仅通过固定的几个字节就能够编译出二进制表达的含义,而是通过定义一些常量类型来表示,每个常量类型它有自己的独特结构以此来表达它的含义,常量池类型发展至今已经有17个,下图是常见的11个。

常见的11个常量池类型如下图:


常量列表示他的名字不在class文件中表示,项目表示每个常量类型的结构,tag表明常量类型,byte表示常量项包含的具体内容。第一项CONSTANT_Utf8_info表达的是一个字符串,包含一个length结构表示这个字符串有多少个字节组成。还有一些项目包含index结构,表示他是通过引用常量池的其他常量项来表达(下一节分析具体示例能更加理解)。类型表示各个常量项各个结构暂用的字节数。

常量池示例分析

还是按照上一篇文章的class文件继续分析,文件内容图如下图:


上一篇文章我们分析了前8个字节"CA FE BA BE 00 00 00 34",通过前面两节的分析我们知道接下来两个字节是constant_ pool_count,"00 18"转换成10进制是24,所以说明接下来有24-1=23个常量项

接下来的内容就该是常量项:

我们知道常量项最前面的结构都是tag都占一个字节,所以"0A"表示第一个字节的tag,十进制表示是10,通过查表知道tag等于10的常量类型是CONSTANT_Methodref_info(结构tag U1;index U2;index U2),说明这个常量表达的是一个方法的表达式,同时通过结构知道接下来的2个字节表达的方法的类描述符所在的常量项,"00 04"说明常量池第4项是这个方法的类描述符,接下来两个字节是方法的名称和类型,"00 14"十进制是20说明常量池第20个常量;

第2个常量池tag"09"表示这个常量项是CONSTANT_Fielderf_info(结构tag U1;index U2;index U2)类型,然后接下来4个字节"00 03 00 15"说明这个字段的类和描述符分别存在常量池的第3、21项;

第3个常量池tag"07"表示CONSTANT_Class_info(tag U1;index U2)是一个类的全限定名称,接下来两个字节"00 16"表示类的全限定名称在常量池第22项;

第4个tag"07"和上一个一样,"00 17"表示类的全限定名称在常量池第23项;

第5个tag"01"表示CONSTANT_Utf8_info(tag U1;length U2;byte U1)是用来表达字符串的,接下来2个字节"00 04"表示字节长度,说明接下来4个字节都是字符串的内容"76 61 72 31",通过ASCII表查询结果为var1,这是因为我在类中定义了一个变量var1;

第6个tag"01",又是一个字符串,长度为"00 01",内容"49",ASCII表查询结果I;

第7个tag"01",长度"00 06",内容"3C 69 6E 69 74 3E",结果<init>,在字节码里面构造方法就是<init>,这个后面说明;

第8个tag"01",长度"00 03",内容"28 29 56",结果()V,在字节码里用来表达方法无参数返回值为void,与<init>()V可以表达一成一个无参构造方法;

第9个tag"01",长度"00 04",内容"43 6F 64 65",结果Code;

第10个tag"01",长度"00 0F",内容"4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65",结果LineNumberTable;

第11个tag"01",长度"00 12",内容"4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 ",结果LocalVariabletable;

第12个tag"01",长度"00 04",内容"74 68 69 73",结果this;

第13个tag"01",长度"00 1E",内容"4C 63 6F 6D 2F 64 67 67 63 63 2F 74 65 73 74 2F 6C 65 69 2F 43 6C 61 73 73 54 65 73 74 3B",结果"Lcom/dggcc/test/lei/ClassTest;";

第14个tag"01",长度"00 07",内容"67 65 74 56 61 72 31",结果getVar1;

第15个tag"01",长度"00 03",内容"28 29 49",结果()I;

第16个tag"01",长度"00 07",内容"73 65 74 56 61 72 31",结果setVar1;

第17个tag"01",长度"00 04",内容"28 49 29 56",结果(I)I;

第18个tag"01",长度"00 0A",内容"53 6f 75 72 63 65 46 69 6c 65",结果SourceFile;

第19个tag"01",长度"00 0E",内容"43 6C 61 73 73 54 65 73 74 2E 6A 61 76 61",结果ClassTest.java;

第20个tag"0C"表示12对象常量类型CONSTANT_NameAndType_info(tag U1;length U2;byte U2),表示字段或者方法的名称和描述,接下来4个字节"00 07 00 08",分别是常量池的第7、8项,结果为<init>:()V;

第21个tag"0C"与上一个类型一样,接下来4个字节"00 05 00 06",分别是常量池的第5、6项,结果为var1:I;

第22个tag"01",长度"00 1C",内容"63 6F 6D 2F 64 67 67 63 63 2F 74 65 73 74 2F 6C 65 69 2F 43 6C 61 73 73 54 65 73 74",结果com/dggcc/test/lei/Classtest;

第23个tag"01",长度"00 10",内容"6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74",结果java/lang/Object;

至此常量池数据分析完成,可以再返回去分析出前4个常量包含的内容,可以看出每个常量项要么直接表达出包含内容,要么通过指向常量池的一项或多项来组合成表达的结果,在idea通过javap -verbose com.dggcc.test.lei.ClassTest验证结果,结果如下图:


总结

这里由于这个类比较简单,所以常量池较少,不过基本常见的结构都已经包含了,可以看出常量池中主要保存的是一些字符串,或者多个常量池字符串组合。到目前为止可能还看不出来常量池的作用,不过通过存储的内容也可以大概猜出,它基本包含了接下来为了表达用户代码所需要的字符串。

字节码文件的分析到目前为止已经过半,却还没有涉及到用户代码,不过常量池分析完成也就是用户代码编译的基础已经完成,接下来就可以继续分析用户代码了,下一篇文章继续!

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!


  • 雅思备考攻略及资料大全(0基础到6分完整复习指南)
  • 2024-09-270基础到6分完整复习指南各位学霸们好,今天黄老师给大家来聊聊从零基础到6分的雅思复习计划有很多零基础学生在咨询黄老师时都是这样的情况:只能用简单的英语,和认识最基本的词汇但是需要在几个月内考到雅思6(6.5)分,毫无头绪应该。
  • 小说嫡女重生顶流女王她又强又野(上辈子她宅斗到死)
  • 2024-09-27上辈子她宅斗到死南星小脸懵逼什么江家不江家的,和她有什么关系?但或许是被这两个字刺激,脑海中有段被原身刻意遗忘的记忆,这一刻再次冒芽十八年前,楚家大小姐楚明月委身下嫁给穷小子江海川因为家人强烈反对,楚明月不顾一切,不。
  • 延禧攻略剧情介绍如懿传(延禧攻略占据天时地利人和)
  • 2024-09-27延禧攻略占据天时地利人和文|栗子近日《如懿传》、《延禧攻略》开播,被文学和艺术宠爱的乾隆又在新时代的荧幕上盖上了他的印章我们的审美仿佛清朝的瓷器,正从雍正的隽秀尔雅,朝着乾隆的“色彩浓烈”过渡《如懿传》依旧贯穿了流潋紫的《甄。
  • 新生儿6大证件办理攻略(史上最全新生儿证件办理)
  • 2024-09-27史上最全新生儿证件办理自从二胎政策实施以来,准生证已经不需要啦,相应办理证件都有所变化,现在根据我们的办理经验,整理成以下资料,希望能帮上准爸准妈们;一、生育登记信息表办理时间:孩子出生前,母亲在住院生产前;需要提供此生育。
  • 如何制作销售话术技巧培训ppt(企业如何做好销售渠道)
  • 2024-09-27企业如何做好销售渠道请多关注、点赞、转发!如何做好销售渠道?销售渠道的关键点、原则及方法PPT源文件!目录一、什么叫“做好渠道销售”,标准是什么?二、渠道销售有哪些关键点?三、每个关键点做好有哪些通用的原则或则方法可以遵。
  • 玩水安全事件(在水世界更衣室被刮伤)
  • 2024-09-27在水世界更衣室被刮伤新闻报料点击上图陶小姐说,6月26日她和朋友一共四人到福州市连江县贵安水世界玩,下午两三点钟入园,大概傍晚6点游玩结束,她和朋友到更衣室换衣服,当她把泳衣放在置物架上时,她感觉自己的手被划了,一看,果。
  • 每天一百个臀桥坚持一个月的效果(每天坚持100个臀桥)
  • 2024-09-27每天坚持100个臀桥人都说“无深蹲不翘臀”,当然,除了深蹲之外,还有一些动作,也可以高效刺激臀部肌群其中,有这么一个好动作,但同时,也是一个很容易做错的动作,它就是臀桥这不,最近网上又流行起了“100个臀桥挑战”那么,臀。
  • 胡一天宋祖儿现状(宋祖儿出演我们相爱吧第四季)
  • 2024-09-27宋祖儿出演我们相爱吧第四季前段时间闹得沸沸扬扬的胡一天“夜会门”,与网红邶也邶之间的事情一天到晚的登上热搜,网红邶也邶更是在微博上爆料出了疑似胡一天diss《小美好》中的女主沈月,一瞬间,在剧中树立的高大帅气的男生形象瞬间崩塌。
  • 星之守护者洛陨获取方法(星之守护者背景故事星陨在国服上线)
  • 2024-09-27星之守护者背景故事星陨在国服上线今天,国服在英雄联盟宇宙页面上线了星之守护者2017的背景故事这个名为《星陨》的短篇故事主要讲述了拉克丝和她的朋友们将在流星雨中迎接新的星星,而这趟旅程也考验着她身为队长的信心和能力除此之外,官方还上。
  • 冬天太冷哪种取暖器好用(冬季用空调取暖太干燥)
  • 2024-09-27冬季用空调取暖太干燥家用电油汀家里暖气不热,只能靠空调辅助取暖,然而空调用久了室内空气干燥,不开窗通风会觉得口干舌燥,待在屋子里十分不舒服好在家里预备了一台电油汀,虽然制热效率没有空调高,可是它主要靠导热油升温散热,不直。
  • 腾冲火山地质公园旅游体验(腾冲火山热海旅游区)
  • 2024-09-27腾冲火山热海旅游区前言随着大滇西旅游环线的带动作用日益显现,腾冲市按照全域旅游总体要求,紧紧围绕市委、市政府提出的“两个5A,十个4A,百个A级景区”创建目标,不断加快景区创建工作目前,腾冲共有A级景区32个,为更系统。
  • 2-3岁儿童抗疫画画(百娃欢庆三月三)
  • 2024-09-27百娃欢庆三月三南宁市百花岭路小学部分班级在线开展“壮族三月三”活动南宁市百花岭路小学供图南宁市百花岭路小学的小朋友自制壮族特色美食五色糯米饭南宁市百花岭路小学供图南宁市百花岭路小学的小朋友自制绣球南宁市百花岭路小学。