详解虚拟机识别的Class类文件结构信息

一、魔数

每个class的头4个字节叫做魔数,用来表示这个文件是不是能被虚拟机所识别的文件。这个值就是cafebabe(咖啡宝贝)。

二、版本号

class文件中,第5和第6个字节表示的是java的此版本好,第7和第8个字节是主版本号,上图中0034表示的是10进制的52,也就是java8的版本。依次类推,JDK7表示51,JDK6表示50。

三、常量池

常量池可以作为class文件中的资源仓库。其中常量池中主要存放字面量(Literal)和符号引用(Systembolic References)。

字面量:可以理解为我们在代码中定义的值:如字符串的值,被声明为final的常量值。

符号引用:主要包括被模块导出或者开放的包;类和接口的全限定名;字段的名称和描述符;方法的名称和描述符;方法句柄和方法类型;动态调用点和动态常量。

以下面这段代码为例:我们可以使用javap -verbose来查看代码中的全部常量池信息:

示例代码:

public class TestClass {

    private int m;

    public int inc() {
        return m + 1;
    }
}

其中常量池部分如下:

四、访问标志

访问标志是用来识别类或者接口的访问权限,例如public,final,abstract等字段。

标志名称标志值含义
ACC_PUBLIC0x0001是否为public类型
ACC_FINAL0x0010是否被声明final,只有类可设置
ACC_SUPER0x0020是否允许使用invokespecial。
ACC_INTERFACE0x0200标识这是一个接口
ACC_ABSTRACT0x0400是否为abstract类型,对于接口或者抽象类来说,此标志值为真,其他类型值为假
ACC_SYNTHETIC0x1000标识这个类并非由用户代码产生的
ACC_ANNOTATION0x2000标识这是一个注解
ACC_ENUM0x4000标识这是一个枚举
ACC_MODULE0x8000标识这是一个模块

五、字段表集合

用于描述接口或者类中声明的变量;其中对于描述符来描述方法时,按照先参数列表、后返回值的顺序描述。()I表示,参数为空,返回类型为int。

标识字符含义
B基本类型byte
C基本类型char
D基本类型double
F基本类型float
I基本类型int
J基本类型long
S基本类型short
Z基本类型boolean
V特殊类型void
L对象类型,如Ljava/lang/Object

六、属性表集合

用来描述某些场景专有的信息。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值