类文件结构-笔记

前言

介绍本章之前总结了下一些和.class文件相关的其他知识点。

class文件相关介绍

  • 我们都知道,我们在本地编写了一个.java源文件,当我们编辑源代码时本地会相应的生成.class文件。
  • 生成的.class文件就是运行在jvm上面的

ps:无论你是cmd中(windows下)调用javac,还是使用编辑器调用,最终都是调用了你jdk安装包下bin目录下javac可执行文件,编译源代码 生成.class文件。

跨平台原理

Java开发的所有程序都可以在任何的操作系统上运行,主要是因为在不同的操作系统上装上了不同的软件(Java虚拟机)。Java虚拟机简称Jvm(Java Virtual Machine)


image.png

可以知道不同的平台虚拟机运行的都是.class文件,所以可以理解为.class是跨平台的。

正文:class类文件结构

class 文件概述:
Class文件是一组以8位字节为基础单位的二进制流,各项数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,如果是超过8位字节以上空间的数据项,则会按照高位在前的方式(Big-Endian)分割成若干个8位字节进行存储。
class文件格式:类似c语言结构体的伪结构来存储数据,这种伪结构特点只有两种数据类型(详解如下图)

  • 无符号数

  • image.png
image.png

无符号数的作用:
可用来描述数字,索引引用,数量值或者按照UTF-8编码构成的字符串值。

表:是一种复合的数据类型


image.png

是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。

表用于描述由层次关系的复合结构的数据,整个Class文件本质上就是一张表。(他由如下数据项构成)

image.png
1 魔数

概念:每个Class文件的头4个字节称为魔数(Magic Number)
作用:它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件(白话就是这个文件是否是class文件)
class文件的魔数值:0xCAFEBABE(咖啡宝贝)。

ps:其他文件的魔术值参考如下(网上找了一些):

JPEG (jpg),文件头:FFD8FF 
PNG (png),文件头:89504E47 
GIF (gif),文件头:47494638 
TIFF (tif),文件头:49492A00 
Windows Bitmap (bmp),文件头:424D 
CAD (dwg),文件头:41433130 
Adobe Photoshop (psd),文件头:38425053 
Rich Text Format (rtf),文件头:7B5C727466 
XML (xml),文件头:3C3F786D6C 
HTML (html),文件头:68746D6C3E 
Email [thorough only] (eml),文件头:44656C69766572792D646174653A 
2 class文件的版本号:

紧接着魔数的4个字节是Class文件的版本号:第5,6字节是次版本号(Minor Version),第7,8字节是主版本号(Major Version)。

高版本的jdk可以向下兼容以前版本的class文件但是不能运行以后版本的class文件。
每个版本的jdk都有其支持的class版本号的范围。

3 常量池

紧接着主次版本号之后是常量池入口。
概念模型: 可以理解为class文件中的资源仓库。
常量池中主要存放两大类常量:字面量(Literal)和符号引用。


image.png
image.png

常量池中每一项常量都是一个表,在JDK1.7之后共有14种表结构,它们有一个共同的特点,就是表开始的第一位是一个u1类型的标志位(tag,取值见下表),代表当前这个常量属于哪种常量类型。

常量池的项目类型

image.png

image.png

总表:


image.png
4 访问标志

紧接着常量池之后的两个字节代表访问标志(access_flags),用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口、是否为public类型、是否为abstract类型、类是否声明为final等。
ps:接口, 类,单独的文件时会被编译为.class 文件
接口 或者类 在类文件的{}之外,编译时也会被编译为单独的.class文件

demo.java文件中
public class demo{
// class 内部
}
class(或者interface) test{
}

编译后本地生成 demo.class  test.class

标志位及其含义如下表:


image.png

access_flags(f访问标志)中一共有16个标志位可以使用,当前只定义了其中8个,没用使用到的标志位要求一律为0。 access_flages的值即为类满足上表中的值做或运算得到的值

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

简介:类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据集合。
功能:Class文件中由这三项数据来确定这个类的继承关系

  • 类索引用于确定这个类的全限定名
  • 父类索引用于确定这个类的父类的全限定名。
  • 接口索引集合用来描述这个类实现了哪些接口。这些被实现的接口将按照implements语句(如果此类是接口则应当是extends语句)后的接口顺序从左到右排列在接口索引集合中。

ps:由于java语言不允许多继承所以父类索引只有一个Object类除外,所有父类索引都不为0 Object除外

6 字段表集合
  • 字段表(field_info)用于描述接口或者类中声明的变量。
  • 字段包括类级变量以及实例级变量。但不包括方法内声明的局部变量。

在java中描述一个字段可以包含什么信息:


描述字段可包含的信息.png

上图的信息各个修饰符都是布尔值,要么有修饰符,要么没有,很适合用标志位来表示,而字段叫什么名字,字段被定义为什么类型这些都是无法固定的,只能引用常量池中的常量来描述。

7 方法表集合

跟在字段表集合后的是方法计算器:用于标识有多少个方法;紧接着的就是放发表集合。

Class文件存储格式中对方法的描述与对字段的描述几乎采用完全一致的方式。

8 属性集合

属性表(attribute_info)在前面的讲解中已经出现多次,在Class文件、字段表、方法表、属性表都可以携带自己的属性表集合,用于描述某些场景专有的信息。与Class文件中其他的数据项目要求严格的顺序、长度和内容不同,属性表集合的限制稍微宽松了一些,不再要求各个属性表具有严格顺序,并且只要不与已有属性名重复,任何人实现的编译器都可以想属性表中写入自己定义的属性信息,Java虚拟机运行时会忽略掉它不认识的属性。

code属性:

Java程序方法体中的代码经过Javac编译处理后,最终变为字节码指令存储在Code属性中,Code属性出现在方法表的属性集合之中。但并非所有方法表都有Code属性,例如抽象类或接口。

Exception属性:
Exception属性的作用是列举出方法中可能抛出的受查异常(Checked Exceptions), 也就是方法描述时在throws关键字后面列举的异常。

LineNumberTable属性:
LineNumberTable属性用于描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系。

LocalVariableTable属性
LocalVariableTable属性用于描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的关系。

SourceFile属性
SourceFile属性用于记录生成这个Class文件的源码文件名称。

ConstantValue属性

ConstantValue属性的作用是通知虚拟机自动为静态变量赋值。只有被static关键字修饰的常量(类变量)才可以使用这项属性。目前Sun Javac编译器的选择是:如果同时使用final和static来修饰一个变量,并且这个变量的数据类型是基本类型或者java.lang.String的话,就生成ConstantValue属性来进行初始化,如果这个变量没有被final修饰,或者并非基本类型及字符串,则将会选择在<clinit>方法中进行初始化。
对ConstantValue的属性值只能限于基本类型和String

InnerClasses属性
InnerClasses属性用于记录内部类与宿主类之间的关联。

属性表集合之Deprecated及Synthetic属性
两个属性都属于标志类型的布尔属性,只存在有和没有的区别,没有属性值的概念。Synthetic代表字段或者方法并不是有Java源码直接产生的,而是由编译器自行添加的。

属性表集合之StackMapTable属性

StackMapTable属性在JDK1.6发布后增加到了Class文件规范中,它是一个复杂的变长属性,位于Code属性的属性表中。会在虚拟机类加载的字节码验证阶段被新类型检查验证器(Type Checker)使用,目的在于代替以前比较消耗性能的基于数据流分析的类型推导验证器。一个方法的Code属性最多只能有一个StackMapTable属性。

属性表集合之Signature属性

Signature属性在JDK1.5增加到Class文件规范之中,用于记录泛型签名信息。Java语言的泛型采用的是擦除法实现的伪泛型,缺点就是运行期做反射时无法获得到泛型信息,Signature属性就是为了弥补这个缺陷而增设的。

属性表集合之BootstrapMethods属性

BootstrapMethods属性在JDK1.7增加到Class文件规范之中的。它是一个复杂的变长属性,位于类文件的属性表中。用于保存invokedynamic指令引用的引导方法限定符

指令介绍略。。。。。

总结的很粗略,大概的写了下相关知识点 很多都是懵懵懂懂,先熟悉一遍,有个大概印象,以后慢慢会看书本,慢慢理解,嘿嘿。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 1.使用命令行,进入项目所在文件,输出 生成一个 2.可以使用xcode打开本文件这里是选择支持的ios系统: 打...
    time_xie阅读 334评论 0 0
  • 隔壁的那个院子又找了个新租户。下午在院子里晒太阳时,房东大哥带着那个看上去有些孱弱的男人来看我们的院子。听房东说,...
    达文溪阅读 368评论 2 4
  • 雨前椿叶如丝嫩,沸水一经褪紫衣。 撒向凝脂呈碧绿,又摊鸡蛋裹香齐。 注:凝脂指豆腐 ​
    半步天阅读 1,755评论 4 9
  • 2018.1.5 唐春桃 隐私与反省的区别! 昨天发送修行日记,感觉自己挖得太深了,写了自己觉得是隐私的东西,有些...
    tangchuntao唐糖阅读 283评论 4 4