java class文件常量池_JAVA程序员谈谈class文件结构中的常量池-class文件

48c9d07e4f6a8af0763332323ac32854.png

常量的类型有12种

CONSTANT_Utf8_info1字面量UTF-8编码的字符串

CONSTANT_Integer_info3字面量整型字面量

CONSTANT_Float_info4字面量浮点型字面量

CONSTANT_Long_info5字面量长整型字面量

CONSTANT_Double_info6字面量双精度浮点型字面量

CONSTANT_Class_info7符号引用类或接口的符号引用

CONSTANT_String_info8字面量字符串类型字面量

CONSTANT_Fieldref_info9符号引用字段的符号引用

CONSTANT_Methodref_info10符号引用类中方法的符号引用

CONSTANT_InterfaceMethodref_info11符号引用接口中方法的符号引用

CONSTANT_NameAndType_info12符号引用字段或方法的部分符号引用

这些常量一般都是相互引用的,是一个常量引用了另一个常量,其中String等基本类型大家都很好理解,我们也不多做讨论,下面我们挑选几个相对来说不是很好理解的来说说,按照顺序来看

UTF8常量

523fd1c168df62855eaf6ce45533ebad.png

看到UTF8我们就会想到,这是一种字符编码格式,可以存储多个字节长度的字符串值,例如可以存储方法名等很长的一个字符串。

UTF8类型一般是由前两个字节来表示后面所存储的字符串总字节数,例如 01004c,其中,01表示UTF8类型常量,004c表示后面的字节数,004c = 4*16+12 = 76,也就是后面有76字节数长度。大概结构如下,可以分成三部分理解,一是常量是什么格式,第二个是常量有多少字节,第三个是常量的实际内容。

[01 | byte byte |byte byte.....]

Fieldref、Methodref常量

562754bb1a04808051e5d4d73fd973d1.png

这两个很明显是为了描述Class中的属性项还有方法的,那么如何去表示Class中的一个属性和方法呢?我们首先要分析一下这两个常量中都有哪些信息。

0900110010这个常量就是Fieldref常量,09是标识,0011表示该Fieldref是哪个类中的Field,存储的是第几个常量的位置,0010表示该常量名和类型也就是NameAndType类型常量的索引。Methodref与其类似,第一个自己表示的是常量类型10也就是0a。后面两个字节表示是该方法属于哪个类,后面表示的也是NameAndType类型常量的索引。

[09 | byte byte |byte byte|] [0a | byte byte |byte byte]

Class常量

Class常量表示的事该类的名称,它会指向另外一个UTF8类型的常量,该常量存储具体的该类的名称。例如070013,07表示的是Class类型常量,0013指向的是第19个常量,而当我们找到第19个常量,可以发现它是一个UTF8常量,并且可以发现它存储的就是一个类的名称。

[07 | byte byte]

NameAndType常量类型

该常量是为了表示Methodref和Fieldref的名称和类型描述做的进一步说明而存在的,名称一般是由UTF8常量来表,类型的描述也是由UTF8来表示,所以这个类型是由一个字节的类型标识加上两个字节的UFT8位置索引构成的。例如0c00070008,0007指向第七个常量,也就是Fieldref类型常量或者Methodref,0008指向的第八个常量则是Methodref的返回类型或者是Fieldref的参数类型。

[0c | byte byte |byte byte]

0e2e2cb7709e6b68bd97dab011cf3633.png

大家好,我是一个程序员,对,就是你们认为的那种程序员,平时会写点文章,一个是可以再这个过程自己也学习并能巩固,第二也是可以跟大家分享一下,各位同是猿类的可以帮忙点关注,点点赞来支持一下你们搬砖路上的小伙伴,谢谢啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 输出图案

在C语言中使用 * 号输出各种图案。 用 * 输出字母C 效果 完整代码 #include <stdio.h>int main() {printf("用 * 号输出字母 C\n");printf(" ****\n");printf("*\n");printf("*\n");printf(" ****\n");} 用 * 输出…

C 多数排序

使用C语言编写程序对多个数字进行排序输出的操作。 根据提示输入十个数字并按照从小到大的顺序进行输出显示。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int i,j,a[N],temp;printf("请输入 10 个数字&#xff1a;\n");for(i0;i<N;i)s…

java httppost wsdl_Java使用HttpUrlConnection调用webService(wsdl)

首先需要下载工具https://pan.baidu.com/s/1XQ-VubxcPFoqwGm7wierHg下载成功后解压打开exe程序&#xff0c;在wsdl endpoint中输入你wsdl的地址&#xff0c;点击get&#xff0c;等待一小会后会跳到invoke标签下的界面点击某个方法&#xff0c;例如上图的login&#xff0c;可以看…

C 反向输出

使用C语言的递归方法对输入的字符进行反向输出。 效果 完整代码 #include <stdio.h>int main() {int i5;void palin(int n);printf("请输入5个字符\40:\40");palin(i);printf("\n"); } void palin(n) int n; {char next;if(n<1) {nextgetchar(…

C 数组逆序输出

编写程序对固定内容的数组进行逆序输出&#xff0c;第一个值和最后一个值的位置互换。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int a[N]{10,100,20,43,54,15,6,77,82,91};int i,t;printf("原始数组是:\n");for(i0;i<N;i)printf(&quo…

C 论大小

比较两个数字的大小并进行判断输出。 效果 完整代码 #define LAG > #define SMA < #define EQ #include <stdio.h> int main() {int i,j;printf("请输入两个数字&#xff1a;\n");scanf("%d %d",&i,&j);if(i LAG j)printf("%…

网络第3天

基于UDP的TFTP文件传输 功能&#xff1a;下载、上传、退出 #include <myhead.h> #define IP "192.168.8.100" #define PORT 69 int download_file(int…

滑动加载怎么做 php,vue之UI框架如何实现滑动加载数据

在我们移动端还有一个很常用的组件&#xff0c;那就是滑动加载更多组件。平常我们看到的很多插件实现相当复杂就觉得这个组件很难&#xff0c;其实不是的&#xff01;&#xff01;这个组件其实可以很简单的就实现出来&#xff0c;而且体验也能非常的棒(当然我们没有实现下拉刷新…

EasyX的安装与使用详细教程

EasyX 是针对 C/C 的图形库&#xff0c;可以帮助使用C/C语言的程序员快速上手图形和游戏编程&#xff0c;可以用来做些简单的演示2d类游戏&#xff0c;没有cocos2d-x那样重量级&#xff0c;学习起来也比较简单。 安装 1 . 打开Easyx官网https://easyx.cn/下载 EasyX&#xff…

二维码图片解码

二维码图片解码 现在进入了快节奏的时代&#xff0c;已经没有什么是扫码解决不了的了&#xff0c;我们光知道二维码是远远不能满足我们的需求的&#xff0c;我们需要知道二维码所表示的地址&#xff0c;但是有什么办法可以让我们对二维码进行解析然后获得地址的呢&#xff1f;…

java中函数过载,Java继承中成员方法的overload(重载/过载)

如果Java基础类有一个方法名被“过载”使用多次&#xff0c;在衍生类里对那个方法名的重新定义就不会隐藏任何基础类的版本。所以无论方法在这一级还是在一个基础类中定义&#xff0c;过载都会生效。public class Hide {public static void main(String[] args) {Bart b new B…

matlab 发送 126 邮件,python实现126邮箱发送邮件

用Python发送126邮件&#xff0c;供大家参考&#xff0c;具体内容如下今天想做个自动化邮件提醒的功能&#xff0c;最近刚好在学习python&#xff0c;都说python那么强大&#xff0c;想试一下python能否搞定&#xff0c;搜一下资料&#xff0c;果真可以&#xff0c;而且又简单通…

python 自动化出报表,python实现报表自动化详解

本篇文章将介绍&#xff1a;xlwt 常用功能xlrd 常用功能xlutils 常用功能xlwt写Excel时公式的应用xlwt写入特定目录(路径设置)xlwt Python语言中&#xff0c;写入Excel文件的扩展工具。可以实现指定表单、指定单元格的写入。支持excel03版到excel2013版。使用时请确保已经安装p…

Sublime Text 3 详细安装教程

Sublime Text 3 详细安装 下载 官网下载地址https://www.sublimetext.com/3 安装 1 . 下载完成之后安装程序自动运行&#xff0c;默认安装路径&#xff0c;不要修改&#xff08;如果修改安装路径后期需要配置环境变量&#xff09; 注意&#xff1a;最好使用默认填入的安装…

oracle导出pck文件,Oracle sqlloader自动化导入迁移工具—可批量生成千万控制文件与批处理文件|一键执行(推荐)...

应用介绍一、设计概述与背景&#xff1a;在目前SQL Server数据库和Oracle数据库之间进行数据迁移工作&#xff0c;可以使用多种方案&#xff0c;其中采用文本文件作为数据交换的中间介质&#xff0c;具有如下特点&#xff1a;1、各个主流数据库都支持文本文件的导入、导出功能。…

C++ list,STL list

list 是顺序容器的一种。list 是一个双向链表。使用 list 需要包含头文件 list。双向链表的每个元素中都有一个指针指向后一个元素&#xff0c;也有一个指针指向前一个元素。 在 list 容器中&#xff0c;在已经定位到要增删元素的位置的情况下&#xff0c;增删元素能在常数时间…

Oracle010316,安装oracle后登录时出现 ERROR: ORA-01031 insufficient privileges

运行环境&#xff1a;在自己笔记本电脑上安装测试操作系统版本&#xff1a;64位win8.1oracle版本&#xff1a;64位 oracle 11g安装oracle 成功后//以管理员身份登录oracle在cmd里输入命令 sqlplus / as sysdba然后 报错 ERROR: ORA-01031 insufficient privileges解决办法&…

sencha app watch php,我的第一个基于SenchaTouch的WebApp

经过进一周的各种折腾&#xff0c;各种想放弃&#xff0c;各种纠结&#xff0c;最终还是顺利的完成了SenchaTouch的开发&#xff0c;回想起来感觉“甜甜的”&#xff0c;也充分体会到Sencha MVC开发模式的好处&#xff0c;以及SenchaTouch.js和Extjs的强大和牛逼&#xff0c;不…

kali linux关闭进程,技术|如何使用 Kali Linux 黑掉 Windows

Kali Linux 派生自 Debian Linux&#xff0c;主要用于渗透测试&#xff0c;拥有超过 300 个的预安装好的渗透测试工具。Metasploit 项目中 Metasploit 框架支持 Kali Linux 平台&#xff0c;Metasploit 是一个用于开发和执行安全利用代码(security exploit)的工具。让我们来使用…

linux 内核 82540网卡,Linux网卡as4.2 编译安装及配置准备

Linux网卡as4.2 编译安装及配置准备[日期&#xff1a;2008-03-28]来源&#xff1a;Linux公社作者&#xff1a;Linux整理[字体&#xff1a;大 中 小]确定make gcc kernel-devel包必须安装,没安装的话需要手动安装查看是否安装方法rpm -aq|gccrpm -aq|makerpm -aq|kernel-devel解…