.Class文件常量池小理解

本文基于:链接
下面是一个类和它编译出来的JVM能识别的字节码文件,即.Class文件

package com.ejushang.TestClass;
public class TestClass implements Super{
private static final int staticVar = 0;
private int instanceVar=0;
public int instanceMethod(int param){
 return param+1;
 }
}
interface Super{ }

.Class文件常量池小理解
文件中包含很多部分,如下图,u4表示占四个字节,也就是上面这个图第一行0~3,CA FE BA BE,即为magic,主要理解一下constant_pool,按照格式,第一行的8和9表示constant_pool-count,即0X0018,十进制为24,那么就有24个常量,后面很长一部分都是常量池,从第一行的a开始,可以看到后面有很多比较大的字节, 0比较少,并且看到右边有字母和很多点,这应该是阅读器为了方便展示出来的,我猜的,这么多24个常量怎么组织呢,首先每个常量长度不同,比如右边变量名长度都以一样,以及类型不一样
.Class文件常量池小理解
每个常量都会有一个tag在它占的字节里,第一个就是,而且占一个字节,能表示好多种,有下面这么些
.Class文件常量池小理解
如果一个常量的tag也就是第一个字节是0A,那表示这是一个Constant_Methodref_info,07则表示这是一个CONSTANT_Class_info,对应上图,再看下.class文件,先别细看,先看文章
.Class文件常量池小理解
这是我标记了一下的,左上角不同颜色代表不同tag对应的,除了0A,07,01表示为Asciz,03表示Integer,这个tag的目的是:不同常量类型有不同的结构,看图上彩色字右边,它们各自结构不同,Method 0A还包括三个部分,肯定有的tag,class_index和name_and_type_index,对应不同的字节,那么虚拟机解释的时候就知道这个常量到哪里结束,看class文件中我画的彩色的横线,三个部分长度分别为u1,u2,u2,OK那么这个常量就是从第一行的a到e,继续往下又是新的常量,先读第一个tag,知道后面的结构,下一个该读几个字节来确定一个什么信息,看一下紫色的,比如第二行最后三个,是Asciz类型,结构包括tag,length和bytes,tag:01,length:09,那么下面九个字节都是bytes,读进来转换成符号就是staticVar,右边很贴心的写了出来,一个字符或者一个点代表一个字节,一一对应,再往下是Asciz的“I”等等等等

上一篇:面试官问我会ES么,我说不会,抓紧学起【ES(一)聚合分析篇】


下一篇:webView、scrollView、TableView,为了防止滚动时出现偏移,底部黑框问题等