Java class文件格式之数据类型_动力节点Java学院整理
发布时间 - 2026-01-11 01:53:04 点击率:次CONSTANT_Integer_info

一个常量池中的CONSTANT_Integer_info数据项, 可以看做是CONSTANT_Integer类型的一个实例。 它存储的是源文件中出现的int型数据的值。 同样, 作为常量池中的一种数据类型, 它的第一个字节也是一个tag值, 它的tag值为3, 也就是说, 当虚拟机读到一个tag值为3的数据项时, 就知道这个数据项是一个CONSTANT_Integer_info, 它存储的是int型数值的值。 紧挨着tag的下面4个字节叫做bytes, 就是int型数值的整型值。 它的内存布局如下:
下面以示例代码进行说明, 示例代码如下:
package com.bjpowernode.test;
public class TestInt {
void printInt(){
System.out.println(65535);
}
}
将上面的类生成的class文件反编译:
1.D:\Workspace\AndroidWorkspace\BlogTest\bin>javap -v -c -classpath . com.bjpowernode.test.TestInt
下面列出反编译的结果, 由于反编译结果较长, 我们省略了大部分信息:
..................
..................
Constant pool:
..................
..................
#21 = Integer 65535
..................
..................
{
..................
..................
void printInt();
flags:
Code:
stack=2, locals=1, args_size=1
0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21 // int 65535
5: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
8: return
LineNumberTable:
line 6: 0
line 7: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Lcom/bjpowernode/test/TestInt;
}
上面的输出结果中, 保留了printInt方法的反编译结果, 并且保留了常量池中的第21项。 首先看printInt方法反编译结果中的索引为3 的字节码指令:
1.3: ldc #21 // int 65535
这条ldc指令, 引用了常量池中的第21项, 而第21项是一个CONSTANT_Integer_info, 并且这个CONSTANT_Integer_info存储的整型值为65535 。
CONSTANT_Float_info
一个常量池中的CONSTANT_Float_info数据项, 可以看做是CONSTANT_Float类型的一个实例。 它存储的是源文件中出现的float型数据的值。 同样, 作为常量池中的一种数据类型, 它的第一个字节也是一个tag值, 它的tag值为4, 也就是说, 当虚拟机读到一个tag值为4的数据项时, 就知道这个数据项是一个CONSTANT_Float_info, 并且知道它存储的是float型数值。 紧挨着tag的下面4个字节叫做bytes, 就是float型的数值。 它的内存布局如下:
举例说明, 如果源文件中的一句代码使用了一个float值, 如下所示:
void printFloat(){
System.out.println(1234.5f);
}
那么在这个类的常量池中就会有一个CONSTANT_Float_info与之相对应, 这个CONSTANT_Float_info的形式如下:
代码反编译结果如下:
Constant pool:
............
............
#29 = Float 1234.5f
...........
...........
{
............
............
void printFloat();
flags:
Code:
stack=2, locals=1, args_size=1
0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #29 // float 1234.5f
5: invokevirtual #30 // Method java/io/PrintStream.println:(F)V
8: return
LineNumberTable:
line 10: 0
line 11: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Lcom/bjpowernode/test/TestInt;
}
CONSTANT_Long_info
一个常量池中的CONSTANT_Long_info数据项, 可以看做是CONSTANT_Long类型的一个实例。 它存储的是源文件中出现的long型数据的值。 同样, 作为常量池中的一种数据类型, 它的第一个字节也是一个tag值, 它的tag值为5, 也就是说, 当虚拟机读到一个tag值为5的数据项时, 就知道这个数据项是一个CONSTANT_Long_info, 并且知道它存储的是long型数值。 紧挨着tag的下面8个字节叫做bytes, 就是long型的数值。 它的内存布局如下:
举例说明, 如果源文件中的一句代码使用了一个long型的数值, 如下所示:
void printLong(){
System.out.println(123456L);
}
那么在这个类的常量池中就会有一个CONSTANT_Long_info与之相对应, 这个CONSTANT_Long_info的形式如下:
代码反编译结果为:
Constant pool:
.............
.............
#21 = Long 123456l
.............
.............
{
..............
..............
void printLong();
flags:
Code:
stack=3, locals=1, args_size=1
0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc2_w #21 // long 123456l
6: invokevirtual #23 // Method java/io/PrintStream.println:(J)V
9: return
LineNumberTable:
line 7: 0
line 8: 9
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/bjpowernode/test/TestInt;
}
CONSTANT_Double_info
一个常量池中的CONSTANT_Double_info数据项, 可以看做是CONSTANT_Double类型的一个实例。 它存储的是源文件中出现的double型数据的值。 同样, 作为常量池中的一种数据类型, 它的第一个字节也是一个tag值, 它的tag值为6, 也就是说, 当虚拟机读到一个tag值为6的数据项时, 就知道这个数据项是一个CONSTANT_Double_info, 并且知道它存储的是double型数值。 紧挨着tag的下面8个字节叫做bytes, 就是double型的数值。 它的内存布局如下:
举例说明, 如果源文件中的一句代码使用了一个double型的数值, 如下所示:
void printDouble(){
System.out.println(123456D);
}
那么在这个类的常量池中就会有一个CONSTANT_Double_info与之相对应, 这个CONSTANT_Double_info的形式如下:
代码反编译结果为:
Constant pool:
............
............
#21 = Double 123456.0d
............
............
{
.............
.............
void printDouble();
flags:
Code:
stack=3, locals=1, args_size=1
0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc2_w #21 // double 123456.0d
6: invokevirtual #23 // Method java/io/PrintStream.println:(D)V
9: return
LineNumberTable:
line 7: 0
line 8: 9
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/bjpowernode/test/TestInt;
}
CONSTANT_String_info
在常量池中, 一个CONSTANT_String_info数据项, 是CONSTANT_String类型的一个实例。 它的作用是存储文字字符串, 可以把他看做是一个存在于class文件中的字符串对象。 同样, 它的第一个字节是tag值, 值为8 , 也就是说, 虚拟机访问一个数据项时, 判断tag值为8 , 就说明访问的数据项是一个CONSTANT_String_info 。 紧挨着tag的后两个字节是一个叫做string_index的常量池引用, 它指向一个CONSTANT_Utf8_info, 这个CONSTANT_Utf8_info存放的才是字符串的字面量。 它的内存布局如下:
举例说明, 如果源文件中的一句代码使用了一个字符串常量, 如下所示:
void printStrng(){
System.out.println("abcdef");
}
那么在这个类的常量池中就会有一个CONSTANT_String_info与之相对应, 反编译结果如下:
Constant pool:
............
............
#21 = String #22 // abcdef
#22 = Utf8 abcdef
............
.............
{
.............
.............
void printStrng();
flags:
Code:
stack=2, locals=1, args_size=1
0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21 // String abcdef
5: invokevirtual #23 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 7: 0
line 8: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Lcom/bjpowernode/test/TestInt;
}
其中printString方法中索引为3的字节码指令ldc引用常量池中的第21项, 第21项是一个CONSTANT_String_info, 这个位于第21项的CONSTANT_String_info又引用了常量池的第22项, 第22项是一个CONSTANT_Utf8_info, 这个CONSTANT_Utf8_info中存储的字符串是 abcdef 。 引用关系的内存布局如下:
总结
最后总结一下, 本文主要讲解了常量池中的五中数据项, 分别为CONSTANT_Integer_info, CONSTANT_Float_info, CONSTANT_Long_info, CONSTANT_Double_info 和CONSTANT_String_info 。 这几种常量池数据项都是直接存储的常量值,而不是符号引用。 这里又一次出现了符号引用的概念, 这个概念将会在下一篇博客中详细讲解, 因为下一篇博客要介绍的剩下的四种常量池数据项, 都是符号引用, 这四种表示符号引用的数据项又会直接或间接引用上篇文章中介绍的CONSTANT_NameAndType_info和CONSTANT_Utf8_info, 所以说CONSTANT_NameAndType_info是符号引用的一部分。
从本文中我们还可以知道。 虽然说CONSTANT_String_info是直接存储值的数据项, 但是CONSTANT_String_info有点特别, 因为它不是直接存储字符串, 而是引用了一个CONSTANT_Utf8_info, 这个被引用的CONSTANT_Utf8_info中存储了字符串。
# java
# class文件格式
# 数据类型
# Java class文件格式总结_动力节点Java学院整理
# Java class文件格式之特殊字符串_动力节点Java学院整理
# Java class文件格式之数据类型(二)_动力节点Java学院整理
# Java class文件格式之方法_动力节点Java学院整理
# Java class文件格式之属性_动力节点Java学院整理
# Java class文件格式之常量池_动力节点Java学院整理
# Java class文件格式之访问标志信息_动力节点Java学院整理
# Java class文件格式之属性详解_动力节点java学院整理
# 深入理解Java class文件格式_动力节点Java学院整理
# 是一个
# 池中
# 的是
# 值为
# 反编译
# 第一个
# 就会
# 在这个
# 一句
# 所示
# 与之
# 也就是说
# 读到
# 相对应
# 有一个
# 都是
# 举例说明
# 就知道
# 使用了
# 留了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网站制作价目表怎么做,珍爱网婚介费用多少?
创业网站制作流程,创业网站可靠吗?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何用PHP快速搭建高效网站?分步指南
如何用狗爹虚拟主机快速搭建网站?
如何选择PHP开源工具快速搭建网站?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
成都网站制作公司哪家好,四川省职工服务网是做什么用?
七夕网站制作视频,七夕大促活动怎么报名?
如何在阿里云ECS服务器部署织梦CMS网站?
如何用腾讯建站主机快速创建免费网站?
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
C#如何调用原生C++ COM对象详解
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Python制作简易注册登录系统
如何彻底卸载建站之星软件?
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何快速生成凡客建站的专业级图册?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
javascript基本数据类型及类型检测常用方法小结
如何自定义建站之星模板颜色并下载新样式?
大连 网站制作,大连天途有线官网?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
如何用PHP工具快速搭建高效网站?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何为API编写文档_Laravel API文档生成与维护方法
常州企业网站制作公司,全国继续教育网怎么登录?
如何用免费手机建站系统零基础打造专业网站?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
如何在IIS中新建站点并配置端口与物理路径?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何快速选择适合个人网站的云服务器配置?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
焦点电影公司作品,电影焦点结局是什么?
,在苏州找工作,上哪个网站比较好?
网站建设要注意的标准 促进网站用户好感度!
北京企业网站设计制作公司,北京铁路集团官方网站?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
长沙做网站要多少钱,长沙国安网络怎么样?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤

