Class文件

载体

  • 二进制流
  • 字节为单位,没有分隔符,大端编码(高位在前)
  • 由无符号数(u1|u2|u4|u8)和表(*_info)构成
类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count - 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attributes_count 1
attributes_info attributes attributes_count

魔数与版本号

u4: 0xCAFEBABE
版本号以主版本号为主(45开始),只能向下兼容
JDK1.1支持45.0-45.65535
JDK1.2支持45.0-46.65535
JDK1.7支持45.0-51.65535
但使用编译器输出的Class文件的版本号,除了和编译器本身的版本相关外,还可以使用-target参数向前指定

常量池

常量池第0项保留,所以数量为常量池容量+1
表项内容详见《深入理解Java虚拟机》p172

访问标志

0x0001:ACC_PUBLIC
0x0010:ACC_FINAL
0x0020:ACC_SUPER(JDK1.0.2后为真)
0x0200:ACC_INTERFACE
0x0400:ACC_ABSTRACT
0x1000:ACC_SYNTHETIC(不由代码产生)
0x2000:ACC_ANNOTATION
0x4000:ACC_ENUM

类索引、父类索引、接口索引集合

类索引:u2指向常量池中一个类型为Constant_Class_info的类描述符,描述了类的全限定名
父类索引:u2指向常量池中一个类型为Constant_Class_info的类描述符,描述了父类的全限定名
接口索引:u2的接口计数器,计数器个u2类型的类描述符

字段表集合

field_info

一个字段项包括如下部分:

  • u2: access_flags 字段修饰符
  • u2: name_index 简单名称
  • u2: desciptor_index 描述符
  • u2: attribute_count 属性表计数器
  • attribute_info: attributes 属性表集合
name_index, descriptor_index 字段名称和描述符

分别指向了常量池中的名称和类型,相当于常量池中的nameAndType
描述符标识字符含义

字符 含义 字符 含义
B byte J long
C char S short
D double Z boolean
F float V void
I int L 对象,Ljava/lang/Object

数组类型前置一个[,java.lang.String[][]为[[Ljava/lang/String

attributes 属性表集合

attributes用来描述额外信息,如初始值等

注意

不会包括继承字段,但可能会包括未定义字段,如内部类保持一个外部类的引用

方法表集合

结构与字段表一样

descriptor_index 描述符

先参数列表,按顺序放在()之中,然后跟着返回值类型
void inc() --> ()V
String toString() --> ()Ljava/lang/String;

注意

不会包括没有重写的父类方法;
如果没有显示定义的构造函数,会添加一个名为"<init>"的实例构造器;
方法中也可能会有类构造器"<clinit>";
Class文件中的方法重载,只要描述符不完全一样即可,也就是可以通过返回值区分;
方法中的代码会放在方法属性表集合中一个名为"Code"的属性里。

属性表集合

字段,方法,Class文件,Code属性都可以包括各自的属性表集合。

属性表元素结构

u2:attribute_name_index 指向常量池一个utf8
u4:attribute_length 属性值的长度
u1:info

方法属性表
名称 含义
Code Java代码编译成的字节码指令
Exceptions 方法抛出的异常
Deprecated 被D的方法(boolean)
Signature 用于泛型情况下的方法签名,避免擦除后签名混乱
Synthetic 标识自动生成的方法(boolean)
RuntimeVisibleAnnotations 指明运行时可见的注解
RuntimeInvisibleAnnotations 运行时不可见的注解
RuntimeVisibleParameterAnnotations 运行时可见的方法参数注解
RuntimeInvisibleParameterAnnotations 运行时不可见的方法参数注解
AnnotationDefault 注解类元素的默认值

Code属性

类型 名称 含义
u2 attribute_name_index Code
u4 attribute_length 属性值的长度
u2 max_stack 操作数栈最大深度(用于栈帧中分配)
u2 max_locals 局部变量表需要的空间,32位以下的数据类型一个Slot,以上的两个Slot,包括了方法参数、局部变量、this、异常参数(catch)等,但由于作用域的问题,Slot可以复用
u4 code_length 字节码长度,最多65535条
u1 code 一条字节码指令一个字节
u2 exception_table_length 异常表长度
exception_info exception_table 异常表(深入理解Java虚拟机P186)
u2 attributes_count 属性表计数器
attribute_info attributes 属性表

Code的属性表中包括了三个个属性
LineNumberTable用于描述Java源码与字节码行号的对应关系
LocalVariableTable用于描述栈帧中局部变量表中的变量与Java源码定义的变量之间的关系
StackMapTable在虚拟机加载字节码的验证阶段被新类型检查验证器使用

字段属性表
名称 含义
ConstantValue final关键字定义的常量值
Signature 泛型
Deprecated 被D字段
Synthetic 自动生成
RuntimeVisibleAnnotations 指明运行时可见的注解
RuntimeInvisibleAnnotations 运行时不可见的注解
Class文件属性表
名称 含义
EnclosingMethod 局部类或者匿名类标识外围方法
InnerClasses 内部类列表
SourceFile 源文件名称
SourceDebugExtension 额外的调试信息
LocalVariableTypeTable 用特征签名代替描述符,描述泛型参数化类型
BootstrapMethods invokedynamic引用的引导方法限定符
Signature 泛型
Deprecated 被D字段
Synthetic 自动生成
RuntimeVisibleAnnotations 指明运行时可见的注解
RuntimeInvisibleAnnotations 运行时不可见的注解
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容