深入理解JAVA虚拟机学习笔记16——Class类文件的结构(4属性)

我们的口号是:每天进步一点点!

上一篇的字段写到属性的时候,由于属性涉及到的内容比较多,我们暂时搁置了,这一篇是Class文件结构的最后一篇,我们就详细说说属性表结合。

九、属性(Attribute):从表中看属性部分分为属性个数(attributes_count)和属性信息(attributes),这个已经没什么好说的了(参考前面的文章),这个单独拿出来主要是属性的类型比较多,如下图所属。类中字段和方法都会用到属性中的信息。

下面我们看一下属性信息(attributes)的结构。

注意!这只是一个基本模型,Java虚拟机没有对属性信息做明确的规定,需要有哪些属性,只要满足有一个u2的名称索引和一个u4的属性信息所占长度就可以,剩下的可以自由定义(最后一刻还是暴露了本性,真没想到你是这样随便的虚拟机)。

对于第一项属性名称的索引(attribute_name_index),相信大家也看出了一个区别,不再是使用“类型-标志”对应的形式了,而是直接存储了属性名称(不是很理解,直接存数字就可以了啊),不知道为什么如此直接。

还得再上这张图……以测试程序为例,attribute_name_index为“00 09”,那么就是指向#9,也就是“ConstantValue”,那我们就顺势扑倒ConstantValue属性吧。

ConstantValue:常量值,如果类中某个字段中包含了这个属性,说明这个字段是静态常量,肯定是static的;

如下图所示的ConstantValue结构,由于的第三个属性是u2类型的索引,所以attribute_length固定为“2”(00 00 00 02)。

让我们再来看一下字节码文件,constantvalue_index为“0a”,指向#10,值是2,为Integer类型。

下面让我们再介绍几个比较常用的属性。

1. Exceptions:方法中throws关键字后面的异常类型集合。

数据结构如下,包含名称( attribute_name_index,就是Exceptions),number_of_exceptions指定了异常个数,exception_index_table是指向常量的索引。

2. Code:存储程序方法体中的代码。

既然是方法体,那接口中肯定是没有这个属性的。

code的结构如下图所示,包含的类型有点多,前两项相信大家已经知道是什么意思了,我们从第三项开始。

max_stack:代表操作数栈深度的最大值。如果超过了,还记得被StackOverflowError异常支配的恐惧吗?

max_locals:局部变量表所需的空间。单位是slot(jvm为局部变量分配内存所使用的最小内存),基本数据类型长度不超过32的占用1个slot,64位的(long,double)占两个slot。

注意,这个max_locals并不是单纯的方法内各局部变量相加之和,当某一个变量声明周期结束的时候,它的空间是可以分配给其它变量使用的。

code_length:方法体生成的字节码指令长度。长度虽然占4个字节,但是虚拟机规定一个方法的字节码指令条数不能超过65533。

code:字节码指令内容。其中每个code占一个字节,也就是可以代表256种指令,字节码对应的指令如下标所示。

光说不练假把式,看图说话。

method_info中的attributes_count为“00 01”,attributes则只有一个,字节码为“00 0d”指向#13,即“code”。

属性值长度为“00 00 00 2f”,为47;

max_stack为1,max_locals为1;

指令长度字节码为“00 00 00 05”,也就是说有5条指令。

0x2a——将第一个引用类型本地变量推送至栈顶——这个说的太官方了,简单理解,本地变量我们应该知道,就是变量池中那37个;引用类型相对的是基本数据类型,也就是说该变量引用的是一个类,那很明显就是#5吗,也就是说把#5的地址放在栈顶,#5对应的值是com/xkx/App。

0xb7——调用超类构造方法,实例初始化方法,私有方法——调用APP的超类构造方法(那就是Object了),实例话方法就是init呗,私有方法貌似没有,就不用调了。

0x00——什么都不做——什么鬼?

0x01——将null推送至栈顶——清空栈顶(事了拂衣去,深藏功与名?)

0xb1——从当前方法返回void——这个就比较好理解了。

然后异常没有(注意:这个异常和上面异常不是一回事,这个指的是代码中的try{……}catch(Exception e){……}finally{……}),又有两个属性,不再赘述。

属性的基本原理就是这样,就不一一列举了,剩下的属性,感兴趣的朋友自行查阅吧。

喜欢文章或想一起学习的朋友可以关注我,给我点赞,我将会持续更新,有什么疑问或文中有不当之处请给我留言,真诚地希望能与大家一起交流探讨,学习进步。

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

推荐阅读更多精彩内容