Java字节码理解

Java字节码其实就是 .class 文件.

我们写出的Java源代码经过编译后就会变成 class文件。

编译过程

源代码是程序员写的。JVM识别不了,因此需要编译器主要对源码代码做编译处理,大致如下:

词法分析器 => 语法分析器 => 语法树/抽象语法树 => 语义分析器 => 注解抽象语法树 => 字节码生成器 => class文件

这个过程涉及编译原理,就不说了。

执行以下命令即可对类进行编译

javac XXX.java

 

Class文件

编译后一个类就用一个 .class 文件表示。官网描述其结构如下

ClassFile {
  u4 magic;
  u2 minor_version;
  u2 major_version;
  u2 constant_pool_count;  // 常量池中常量个数
  cp_info constant_pool[constant_pool_count-1];   // 常量池
  u2 access_flags;  // 类的访问控制标识 public、protect 等
  u2 this_class;  // 当前类名
  u2 super_class; // 父类名
  u2 interfaces_count; // 实现接口数量
  u2 interfaces[interfaces_count]; // 接口数组
  u2 fields_count;  // 类的字段数量
  field_info fields[fields_count];  // 类的字段描述
  u2 methods_count;  // 类的方法数量
  method_info methods[methods_count];  // 类的方法信息
  u2 attributes_count;  // 属性数量
  attribute_info attributes[attributes_count];  // 属性集合
}

说明:

  • magic 表示这是 class 文件,值是 0xCAFEBABE
  • minor_version, major_version 代表 java 不同的版本

  • constant_pool_count 常量池的大小(因为有一个预留,因此实际值=该值-1)

  • cp_info 常量池

  • 这里 u4 代表无符号的4字节. u2 代表2个字节

  • 每一项都是类的具体信息构成

 

常量池

对于常量池,官网说法是:

Java虚拟机指令不依赖于类、接口、类实例或数组的运行时布局。相反,指令引用constant_pool表中的符号信息。

常量池中,每一项的结构如下:

cp_info {
    u1 tag;
    u1 info[];
}

先是一个字节表示是哪种常量(tag),接下来是每一项的具体信息:

Constant Kind

Tag

结构

含义

CONSTANT_Utf8

1

CONSTANT_Utf8_info {

    u1 tag;

    u2 length;

    u1 bytes[length];

}

常量字符串值

CONSTANT_Integer

3

CONSTANT_Integer_info {

    u1 tag;

    u4 bytes;

}

整型常量值

CONSTANT_Float

4

CONSTANT_Float_info {

    u1 tag;

    u4 bytes;

}

浮点型常量值

CONSTANT_Long

5

CONSTANT_Long_info {

    u1 tag;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值