JVM读书笔记(三):类文件结构

类文件结构

一、概述

二、无关性的基石(一次编写,到处运行):字节码

java虚拟机不和任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件包含了
Java虚拟机指令集和符号表以及若干其他辅助信息。

三、Class类文件的结构

任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来,类或接口并不一定都定义在文件里,
(比如可以通过类加载器直接生成)

Class文件是大端序,高位在前(最高位字节在地址最低位)
X86处理器是小端序

Class文件中只有两种数据类型,无符号数和表

无符号数:u1,u2,u4,u8

表:由多个无符号数或者其他表作为数据项构成的复合数据类型

整个Class文件本质上就是一张表

各数据项具体含义:

1、魔数与Class文件的版本

每个Class文件的头4个字节称为魔数,唯一作用是确定这个文件是否是一个能被虚拟机接收的Class文件(身份识别)

0xCAFEBABE

魔数后面的4个字节存储Class文件的版本号:次版本(5、6字节)+主版本号(7、8字节)

2、常量池

紧接版本号之后是常量池入口

主要存放两大类常量:字面量和符号引用

字面量:文本字符串、final常量值
符号引用:
    类和接口的全限定名
    字段的名称和描述符
    方法的名称和描述符

常量池中每一项常量都是一个表,共14种表

javap

3、访问标志

紧跟常量池后面的两个字节:用于标识一些类或接口层次的访问信息(public、abstract、final等)

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

类索引(this_class):u2
父类索引(super_class):u2
接口索引集合(interfaces):一组u2的数据的集合

5、字段表集合

描述接口或者类中声明的变量

6、方法表集合

类似字段表

在java中,要重载一个方法,要求与原方法有相同的简单名称,此外还要有不同的特征签名。
由于返回值不会包含在特征签名中,因此java中无法依靠返回值的不同来对已有方法重载。

特征签名:一个方法中各个参数在常量池中的字段符号引用的集合
7、属性表集合(重点)

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

常用部分:

属性名称                   使用位置                           含义
Code                       方法表                       Java代码编译成的字节码指令
ConstantValue              字段表                       final关键字定义的常量值
Deprecated              类、方法表、字段表               被声明为deprecated的方法和字段
Exceptions                 方法表                       方法抛出的异常
EnclosingMethod            类文件                       标识类所在的外围方法(针对局部类或匿名类)
。。。
(1)Code属性
这个得好好回头看
(2)Signature

反射、泛型

四、字节码指令简介

大部分指令都没有支持整数类型byte、char和short,甚至没有任何指令支持boolean类型。编译器会在运行期
或编译期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为
相应的int类型

内容很多,记得回头看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值