字节码层面分析class文件

class的来龙去脉

Java提供了一种可以在所有平台上都能使用的一种中间代码--字节码类文件(class文件)

  • 有了字节码,无论哪种平台只要安装了虚拟机都可以直接运行字节码。
  • 字节码,解除了java语言和java虚拟机的耦合,其它语言写的代码转换成字节码也可以在虚拟机上运行。


    class的多平台

class的组成

从纵观的角度看,class文件里只有两种数据结构:无符号数和表

  • 无符号数:属于基本的数据类型。以u1,u2,u4,u8来表示1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来表示数字、索引值、数量值或者字符串(UTF-8编码)。
  • 表:表是由多个无符号数或者其它表作为数据项构成的复合数据类型。class文件中所有的表都以"_info"结尾,整个class文件本质上就是一张表。

无符号数和表组成了class的各个结构,这些结构按照预先规定好的顺序紧密的从前向后排列,相邻的项之间没有任何间隙

class文件结构

实例分析

源码
字节码

魔数(magic number)
在class文件开头的四个字节是class文件的魔数,它是一个固定值--0xcafebabe ,魔数是class文件的标志,它是判断一个文件是不是class文件的标准。
版本号
紧跟在魔数后面的四个字节是版本号,前面两个字节代表次版本号,后两个字节代表主版本号。
常量池表(cp_info)
在常量池中保存了类的各种相关信息,比如类的名称、父类的名称、类中的方法名、参数名称、参数类型。
常量池的组织很简单,前端两个字节占有的位置叫做常量池计数器,它记录着常量池的组成元素(常量池项 cp _info)的个数。

每个常量池项都会对应记录着class文件中的某种类型的字面量。JVM根据常量池项中的tag来确定这个常量池项表示的是哪种类型的字面量。



注意 常量池中保存的主要是字面量和符号引用。
字面量是由字命、数字等构成的字符串或数值,字面值只以右值出现。比如 int a=10;string str=”hello“,其中的10 和”hello“都是字面量。
符号引用:符号引用是编译原理中的概念,是相对于直接引用来说的。主要包括了以下三类常量: * 类和接口的全限定名 * 字段的名称和描述符 * 方法的名称和描述符


package com.louis.jvm;
 
public class StringTest {
    private String s1 = "JVM原理";
    private String s2 = "JVM原理";
    private String s3 = "JVM原理";
    private String s4 = "JVM原理";
}


结合上图,#15的常量池项的tag=8,对应表示java.lang.string 的对象,查看表结构,结构体存放的是对#16常量项的指向,而#16存放的是真正的字符串内容。

访问标志(access flag)

紧跟在常量池之后的常量是访问标志,占用两个字节。代表着类或者接口,是否被定义成public,是否是abstract,如果是类,是否被声明成final。


类索引、父类索引、接口索引计数器

标志后2个字节就是类索引,类索引后两个字节是父类索引,父类索引后两个字节是接口索引计数器。
索引都是指向常量池的第某个常量。

字段表

字段表的主要功能是用来描述类或者接口中声明的变量。这里的字段包含类级别变量以及实例变量,不包括方法内部声明的局部变量。组成结构:字段计数器,字段访问标志,变量名索引,变量类型索引。

方法表

方法表主要描述类中的方法。也是以一个计数器开始的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容