Class文件结构介绍[常量池]

简介: 常量池是紧接着主次版本号之后出现的,常量池可以理解为class文件之中的资源仓库,它是Class文件结构中与其他项目管理最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现的表类型数据项目。案例代码还是和前一篇的一样


概述

 常量池是紧接着主次版本号之后出现的,常量池可以理解为class文件之中的资源仓库,它是Class文件结构中与其他项目管理最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现的表类型数据项目。案例代码还是和前一篇的一样,如下:

public class Test {
  private int a;
  public int  run(){
    System.out.println("波波烤鸭");
    return a=1;
  }
}

常量池介绍

1.结构

 由于常量池中常量的数量是不固定的,所以常量池的入口需要放置一项u2类型的数据表示常量池容量计数值,如下:

image.png

 本例中常量池中的常量的个数是35个,注意此处和java中的习惯不一样,这个容器的计数是从1而不是从0开始的,上图的结果是36,代表常量池中有35项常量,索引范围为1~35,0项常量有特殊考虑,当表达“不引用任何一个常量池项目”的含义时可以把索引值置为0来标示。

image.pngimage.png


 在constant_pool_count后是一个表数据类型constant_pool其中存储的就是constant_pool_count计数的那35个常量项。

2.存储数据的类型

 常量池中主要存放两大类型常量:字面量(Literal)和符号引用(Symbolic References).

image.png

注意:

   全限定名中的".“被替换为”/".比如

  image.png

   常量池中存储着最基本的信息,不仅程序会用到,而且Class文件本身也会通过#来引用

  image.png

符号引用:

 符号引用以一组符号来描述所引用的目标(com/dpb/test/Test),符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可,符号引用和虚拟机实现的内存布局无关,引用的目标并不一定已经加载到了内存中。

image.png

直接引用

 直接引用可以指向目标的指针、相对偏移量或者是一个能够直接定位到目标的句柄。直接引用于虚拟机的内存布局相关,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不同。如果有了直接引用,那么,所引用的目标一定已经在内存中存在。

3.表的存储结构说明

 通过观察我们发现,在这14中表中都有些相同的特定,比如表的开始的第一位都是一个u1类型的标志位(tag),代表当前属于哪种类型,具体的标志说明如下:

image.png

参考此表我们就能够看出这35个常量项的类型了。

image.png

 从上面的结构我们也发现不同类型的表数据结构也是不相同的,详细结构如下,参考后会更加详细些。

image.pngimage.pngimage.png

参考《深入理解Java虚拟机》


相关文章
|
6月前
|
存储 Oracle Java
JVM中Class文件结构详解
JVM中Class文件结构详解
131 0
|
存储 Java 程序员
【 class文件结构】
【 class文件结构】
|
5月前
|
存储 XML 安全
JVM系列5-类文件结构
JVM系列5-类文件结构
29 0
|
6月前
|
存储 Java 编译器
深入理解JVM - 类文件结构
深入理解JVM - 类文件结构
75 1
|
6月前
|
缓存 Java
Class常量池与运行时常量池
Class常量池与运行时常量池
|
存储 Java 开发者
【Class文件结构】
【Class文件结构】
|
存储 NoSQL Java
class文件结构详解
写在最前:学习class文件结构不像学习JVM内存结构、垃圾收集器那样,可以对我们写代码时有很多帮助,学习了JVM内存结构,我们在配置虚拟机参数时就会有更全面的考虑,写代码时就可以注意到代码的的优化空间,学习了垃圾收集器,让我们可以根据服务器的配置,更好的选择出适合程序最大吞吐量的收集器,更好的根据服务器硬件配置出合适的参数,学习class呢,则更多的是为了让我们知其然,也知其所以然,让我们知道我们写出的代码在JVM里面到底是怎么运行的,这部分内容会相对枯燥,白话多一些,这里主要分两个部分来详细讲述class文件的机构[class文件结构、字节码指令]。
140 0
class文件结构详解
|
Oracle Java 关系型数据库
JVM虚拟机-Class文件之常量池
JVM虚拟机-Class文件之常量池
167 0
JVM虚拟机-Class文件之常量池
|
存储 Java 编译器
深入理解JVM - 类文件结构(上)
深入理解JVM - 类文件结构(上)
137 0
|
存储 算法 前端开发
JVM Class 文件结构
本文着重介绍 JVM 中 Class 文件相关的内容