Class文件结构-常量池
常量池里存放:
1.字面量(Literal)
• 文本字符串
• 声明为final的常量值(final的8种基本类型)
• 非final的基本类型也可能进(doublefloatlong)
2.符号引用(Symbolic References)
• 类和接口的全限定名(Fully Qualified Name)
• 字段的名称和描述符(Descriptor)
• 方法的名称和描述符
备注:
1. constant_pool_count=1表示常量池中有0个常量项
2. 表的第一个字节表示常量类型(tag)
常量项结构总表
示例:
package zero.desk.constantpool; public class ConstantPool extends C implements A,B{
private String str = "test string";
private final int a = 10;
private final long b = 10;
private final long bb = 100;
private int c = 11;
private float d = 12f;
private float e = 12f;
private double ee = 12f; private int m; public int inc() {
return m + 1;
}
}
Constant pool:
#1 = Methodref #20.#50 // zero/desk/constantpool/C."<init>":()V
#2 = String #51 // test string
#3 = Fieldref #19.#52 // zero/desk/constantpool/ConstantPool.str:Ljava/lang/String;
#4 = Fieldref #19.#53 // zero/desk/constantpool/ConstantPool.a:I
#5 = Long 10l
#7 = Fieldref #19.#54 // zero/desk/constantpool/ConstantPool.b:J
#8 = Long 100l
#10 = Fieldref #19.#55 // zero/desk/constantpool/ConstantPool.bb:J
#11 = Fieldref #19.#56 // zero/desk/constantpool/ConstantPool.c:I
#12 = Float 12.0f
#13 = Fieldref #19.#57 // zero/desk/constantpool/ConstantPool.d:F
#14 = Fieldref #19.#58 // zero/desk/constantpool/ConstantPool.e:F
#15 = Double 12.0d
#17 = Fieldref #19.#59 // zero/desk/constantpool/ConstantPool.ee:D
#18 = Fieldref #19.#60 // zero/desk/constantpool/ConstantPool.m:I
#19 = Class #61 // zero/desk/constantpool/ConstantPool
#20 = Class #62 // zero/desk/constantpool/C
#21 = Class #63 // zero/desk/constantpool/A
#22 = Class #64 // zero/desk/constantpool/B
#23 = Utf8 str
#24 = Utf8 Ljava/lang/String;
#25 = Utf8 a
#26 = Utf8 I
#27 = Utf8 ConstantValue
#28 = Integer 10
#29 = Utf8 b
#30 = Utf8 J
#31 = Utf8 bb
#32 = Utf8 c
#33 = Utf8 d
#34 = Utf8 F
#35 = Utf8 e
#36 = Utf8 ee
#37 = Utf8 D
#38 = Utf8 m
#39 = Utf8 <init>
#40 = Utf8 ()V
#41 = Utf8 Code
#42 = Utf8 LineNumberTable
#43 = Utf8 LocalVariableTable
#44 = Utf8 this
#45 = Utf8 Lzero/desk/constantpool/ConstantPool;
#46 = Utf8 inc
#47 = Utf8 ()I
#48 = Utf8 SourceFile
#49 = Utf8 ConstantPool.java
#50 = NameAndType #39:#40 // "<init>":()V
#51 = Utf8 test string
#52 = NameAndType #23:#24 // str:Ljava/lang/String;
#53 = NameAndType #25:#26 // a:I
#54 = NameAndType #29:#30 // b:J
#55 = NameAndType #31:#30 // bb:J
#56 = NameAndType #32:#26 // c:I
#57 = NameAndType #33:#34 // d:F
#58 = NameAndType #35:#34 // e:F
#59 = NameAndType #36:#37 // ee:D
#60 = NameAndType #38:#26 // m:I
#61 = Utf8 zero/desk/constantpool/ConstantPool
#62 = Utf8 zero/desk/constantpool/C
#63 = Utf8 zero/desk/constantpool/A
#64 = Utf8 zero/desk/constantpool/B
Class文件结构-常量池的更多相关文章
- (十三)class文件结构:常量池(转)
Class类文件的结构 全局规范 1.任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成).本章中,只是通俗 ...
- Java Core - Class文件结构之魔数、版本号、常量池
下图是一个.java文件被编译器编译后产生的二进制的class文件的内容:由图可知,class文件是用两位16进制数来表示的一个字节. 1个字节就是1Byte,1Byte=8bit. 一.魔数(CAF ...
- JVM之运行时常量池(Runtime Constant Pool)
基本特性: 方法区的一部分,在方法去中分配,加载泪或者接口后就创建运行时常量区. class文件每一个类或接口的常量池表(constant_pool table)的运行时表现形式, 包括编译期的数值字 ...
- 《Java虚拟机原理图解》 1.2.2、Class文件里的常量池具体解释(上)
[last updated:2014/11/27] NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了clas ...
- 【JVM虚拟机】(5)---深入理解JVM-Class中常量池
深入理解Class---常量池 一.概念 1.jvm生命周期 启动:当启动一个java程序时,一个jvm实例就诞生了,任何一个拥有main方法的class都可以作为jvm实例运行的起点. 运行:mai ...
- [一]class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构
前言概述 本文旨在讲解class文件的整体结构信息,阅读本文后应该可以完整的了解class文件的格式以及各个部分的逻辑组成含义 class文件包含了java虚拟机指令集 和 符号表 以及若 ...
- class字节码结构(一)(字节码结构和字节常量池的结构)
<Java虚拟机原理图解> 1.1.class文件基本组织结构 关于变量的几个叫法: 局部变量/全局变量:很好区分根据所在位置. 类变量:静态的全局变量. 类常量:全局的final修饰的变 ...
- 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)
我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下 ...
- Java中的常量池
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...
随机推荐
- Swoole高效跟传统的web开发有什么区别?
一.swoole的运行模式 Swoole高效跟传统的web开发有什么区别,除了传统的LAMP/LNMP同步开发模式,swoole的异步开发模式是怎么样的. 1.1.传统web开发模式 PHP web开 ...
- ios宏定义应该呆在恰当的地方
项目为了看起来整洁 并减少不必要的多次拼写 我们会把这样的方法 做成宏定义 那么问题来了 很多文件同时用到一个或多个宏定义 写完之后就会变成这个样子 看起来很乱 阅读性也不好 那么问题来了怎么解决嘞 ...
- atom常用快捷键-mac亲测
目录 最常用 其他 测试没成功 最常用 中文 快捷键 功能 新建界面窗口 Ctrl + Shift + N 新建文件 Ctrl + N 打开文件 Ctrl + O 打开文件夹 Ctrl + Shift ...
- Spring Boot整合Servlet、Filter、Listener
整合 Servlet 方式一: 编写 servlet package com.bjsxt.controller; import javax.servlet.ServletException; ...
- Spring Boot Validation,既有注解不满足,我是怎么暴力扩展validation注解的
前言 昨天,我开发的代码,又收获了一个bug,说是界面上列表查询时,正常情况下,可以根据某个关键字keyword模糊查询,后台会去数据库 %keyword%查询(非互联网项目,没有使用es,只能这样了 ...
- [TimLinux] Python __hash__ 可哈希集合
规则: __hash__ 应该返回一个整数,hash()函数计算基础类型的hash值 可哈希集合:set(), forzenset(), dict() 三种数据结构操作要求 key 值唯一,判断唯一的 ...
- MySQL InnoDB 存储引擎原理浅析
注:本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍<MySQL技术内幕++InnoDB存储引擎>,本文章仅记录个人认为比较重要的部分,有兴趣的可以花点时间读原书. 一.MyS ...
- 【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建
ZooKeeper安装模式主要有3种: 单机版(Standalone模式)模式:仅有一个ZooKeeper服务 伪集群模式:单机多个ZooKeeper服务 集群模式:多机多ZooKeeper服务 1 ...
- Python3 网络编程和并发编程总结
目录 网络编程 开发架构 OSI七层模型 socket subprocess 粘包问题 socketserver TCP UDP 并发编程 多道技术 并发和并行 进程 僵尸进程和孤儿进程 守护进程 互 ...
- 建议收藏:命令创建.net core3.0 web应用详解(超详细教程)
你是不是曾经膜拜那些敲几行代码就可以创建项目的大神,学习了命令创建项目你也可以成为大神,其实命令创建项目很简单. (1)cmd命令行到你打算创建项目的位置 (2)在该目录下创建解决方案文件夹JIY ...