从.java到.class

一、class 类文件

class文件是一组以8位字节为基础的二进制流,中间没有任何分隔符,所以数据的含义和顺序都被严格限定。
class 文件使用两种数据类型保存数据:

  1. 无符号数(有符号数有正负之分)
  2. 表(由无符号数和ITA表构成)

class文件本质就是一张表

二、class类文件结构
  • magic num 和class文件版本
  • 常量池
    主要存放字面量和符号引用:
    字面量:字符串、final常量等
    符号引用:类和接口全限定名、字段名称和描述符、方法名称和描述符
    常量池中每一个常量都是一个表,共14中类型
    image.png
const #7 = Asciz        <init>;
const #8 = Asciz        ()V;
const #9 = Asciz        Code;
const #10 = Method      #3.#11; //  java/lang/Object."<init>":()V
const #11 = NameAndType #7:#8;//  "<init>":()V

其中,第11常量,引用了常量7、8组成了NameAndType常量,
常量7是方法名称,常量8是方法描述符

  • 访问标志
    标识类或接口的访问信息(如public、final、annotation等)
    各种访问标志求和后,可得出总访问标志
  • 类索引、父类索引与接口索引的集合(用以确定类的继承关系)
    通过常量池中索引表示
  • 字段表集合
    描述接口或类中声明的变量(不包括继承来的字段和局部变量)


    image.png

    字段和方法描述符:
    描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)


    image.png

对于数组类型,每一维度使用一个前置“[”字符描述,如String[][]二维数组,被记录为"[[Ljava/lang/String";int[]被记录为"[I"

  • 方法表集合


    image.png

    描述符用来描述方法时,按照先参数列表,后返回值的顺序描述,参数列表严格按照顺序放在一组小括号()中,如:
    void inc() 描述为 ()V
    toString() 描述为 ()Ljava/lang/String
    请反推 ([CII[CIII)I的方法
    方法里的java代码,经编译后成为字节码指令,存放在方法属性表集合中,名为Code的属性中
    字段名、方法名等,都是通过索引表示,索引指向常量池

  • 属性表集合
    在Class文件、字段表、方法表都可以携带自己的属性表集合,用以描述某些场景专有的信息。
    Code属性:


    image.png

code指令执行过程中的数据交换、方法调用等操作都是基于操作栈的,如invokespecial,这条指令作用是以栈顶的reference类型的数据所指向的对象作为方法接收者,调用此对象的实例构造器方法、父类方法、private方法。

注意点:

  1. java中,overload除与原方法同名之外,还要求与原方法特征签名不同,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,而返回值不包含在特征签名中
  2. this关键字
    编译时把this关键字的访问,转换为普通方法参数的访问,调用时自动传入当前实例。局部变量表中也会预留第一个slot来存放对象实例的引用。
  3. LineNumberTable属性
    使用位置:Code属性中
    用于描述java源代码行号和字节码行号(字节码的偏移量)之间的对应关系。由-g:lines控制,如果选择不生成,堆栈中将不会显示出错的行号(源代码行号)。
  4. LocalVariableTable属性
    使用位置:Code属性
    用以描述栈帧中局部变量表中变量与java源码定义变量的关系。由-g:vars控制,如果选择不生成,其他人引用这个方法时,所有参数名称都会丢失。
三、字节码指令

一个字节长度,由操作码+操作数构成
大部分指令都没有支持byte、char、short等,因为编译器在编译期间扩展为int类型数据

  • 方法调用和返回指令
    invokevirtual:调用对象实例方法
    invokeinterface:调用接口方法
    invokespecial:调用需要特殊处理的实例方法
    包括实例初始化方法、私有方法和父类方法等
    invokestatic:调用类方法
  • 异常处理指令
  • 类型转换指令
    i2b、i2c、d2f等
  • 对象创建与访问指令
    new、newarray等
    getfield、putfield、getstatic、putstatic
  • 同步指令
    monitorenter和monitorexit
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容