java 1.class_java class文件的解析(1)

从今天开始分几节介绍Java中最重要的class文件。

包括class文件的结构、class是如何进入到虚拟机中的(类装载)、class的消亡(垃圾收集)

Class的结构

Class 文件由 java 代码编译而来,每个类都会生成一个 .class 文件。 Java class 文件中包含了 java 虚拟机所需知道的、关于类或接口的所有信息。这些信息用表格的形式来说明,我们可以得到 classfile 表:如图 1

f099cec3-89ad-352a-a5b3-12be1f1ae907.jpg

图 1 classfile 表的格式

其中类型或者为表名,或者如表 1 所示的“基本类型”。所有存储在类型 u2 、 u4 和 u8 中的值,在 class 文件中以高位在前的形式出现。

U1

1 个字节,无符号整形

U2

1 个字节,无符号整形

U3

1 个字节,无符号整形

U4

1 个字节,无符号整形

表 1 class 文件“基本类型”

Classfile 表中各项简介如下:

1)         Magic( 魔数 )

每个 java class 文件的前 4 个字节被称为 magic number : 0xCAFEBABE 。魔数的作用在于,可以轻松的分辨出 java class 文件和非 java class 文件。

Class 文件的下面 4 个字节包含了主次版本号。随着 java 技术的发展, java class 文件格式可能会加入新特性。 Class 文件格式一旦发生变化,版本号也会随之变化。如果 class 文件的版本号超出了 java 虚拟机所能处理的有效范围, java 虚拟机将不会处理该文件。

之后的是常量池。其中包含了与文件中类和接口相关的常量。常量池中存储了诸如文字字符串、 final 变量值、类名和方法名的常量。 Java 虚拟机把常量池组织为入口列表的形式。在实际列表 constant_pool 之前,是入口在列表中的计数 constant_pool_count 。

常量池中的许多入口都指向其他的常量池入口,而且 class 文件中紧随着常量池的许多条目也会指向常量池中的入口。在整个 class 文件中,指示常量池入口在常量池列表中位置的整数索引都指向这些常量池入口。列表中的一项索引值为 1 ,第二项索引值为 2 ,以此类推。

例: act.class 的常量池。

“ { }V ”表示一个返回类型为 void的方法。

访问标志。这个字段表示的意思指明了文件中定义的是类还是接口;还定义了在类或接口的声明中,使用了哪种修饰符:是抽象的还是公共的,或者是 final 。类的类型可以为 final ,而 final 类不可能是抽象的,同时接口也不能为 final 类型。

这个类的名字和超类名字。特殊的,对于 object 类, super_class 为 0 ,除此以外 super_class 对于所有的类均有效。对于接口,在常量池入口 super_class 位置的项为 java.lang.object

紧接着 super_class 的是 Interfaces_count 。此项的含义为:在文件中由该类直接实现或者由该接口所扩展的父接口的数量。在这个技术的后面,是名为 interfaces 的数组,它包含了对每个由由该类直接实现或者由该接口所扩展的父接口的常量池索引。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值