5 字节码文件结构

打印 上一主题 下一主题

主题 508|帖子 508|积分 1524

目录

1 Class类文件结构


  • Class文件:是一组以8个字节为基础单位的二进制流,当需要存储空间超过8字节时,会按照高位在前的方式分割【大端法】成若干个8个字节进行存储
  • 魔数:头4个字节,固定值为:0xCAFEBABE
  • 版本号:魔数的后继4个字节,第5和第6个字节是次版本号,第7和第8个字节是主版本号
  • 常量池:版本号的后续字节。
  • 常量池的常量计数值:常量池部分的前2个字节,表示该文件有多少个常量,计数值从1开始
  • 常量池的常量:分为字面量、符号引用
  • 字面量:接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等
  • 符号引用:编译原理方面的概念。

2 常量池

常量池的常量分为两种类型:字面量、符号引用
2.1 字面量

字面量比 较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。
2.2 符号引用

符号引用则属于编译原理方面的概念,包括这几类:

  • 包(Package)
  • 类和接口的全名
  • 字段的名称和描述符
  • 方法的名称和描述符
  • 方法句柄和方法类型
  • 动态调用点和动态常量
2.3 常量的表结构

常量池中每一项常量都是一个表,一共有17种表结构,因此一共有17种常量。17种常量类型如下所示:


2.3.1 表结构的属性解析

表结构,可以表示为:【属性:对应的值】,每种常量类型(表)都有一个或者多个属性,所有属性的解释如下:

  • tag:标志位,用于区分常量类型。
  • index:常量池的索引值,它指向常量池中另外一种类型常量。
  • length:该UTF-8编码的字符串长度是多少字节 (只有CONSTANT_Utf8_info类型才有该属性)
  • bytes:表示 UTF-8_info、Float_info、integer_info 、Long_info、Double_info 等常量类型的值。
  • reference_kind:
  • reference:index:
  • descriptor_index:
  • .......
2.3.2 17种常量的表结构解析

表结构起始的第一位都是flag标志位


(JDK7增加的三种:CONSTANT_MethodHandle_info、CONSTANT_MethodType_info和 CONSTANT_InvokeDynamic_info,JDK11中又增加了第四种常量CONSTANT_Dynamic_info,在后续章节中详细解)
2.4 javap分析字节码文件

javap:用于分析Class文件字节码的工具,在JDK的bin目录中。
javap -verbose 输出字节码的内容。
测试的java代码
  1. package com.minnesota.practice.test;
  2. public class ByteCodeTest {
  3.     private static final String DREAM = "byte dancing";
  4.     public static void main(String[] args) {
  5.         int a = 1;
  6.         int b = 2;
  7.         int c = a+b;
  8.     }
  9. }
复制代码
ByteCodeTest.class 内容浏览:

javap -verbose ByteCodeTest.class 解析后
  1. javap -verbose ByteCodeTest.class
  2. 输出结果:
  3. Classfile /路径脱敏/ByteCodeTest.class
  4.   Last modified 2022-10-25; size 396 bytes
  5.   MD5 checksum be72a2ed3bf8578da63968ce35880d3d
  6.   Compiled from "ByteCodeTest.java"
  7. public class com.minnesota.practice.test.ByteCodeTest
  8.   minor version: 0
  9.   major version: 52
  10.   flags: ACC_PUBLIC, ACC_SUPER
  11. Constant pool:
  12.    #1 = Methodref          #3.#16         // java/lang/Object."<init>":()V
  13.    #2 = Class              #17            // com/minnesota/practice/test/ByteCodeTest
  14.    #3 = Class              #18            // java/lang/Object
  15.    #4 = Utf8               DREAM
  16.    #5 = Utf8               Ljava/lang/String;
  17.    #6 = Utf8               ConstantValue
  18.    #7 = String             #19            // byte dancing
  19.    #8 = Utf8               <init>
  20.    #9 = Utf8               ()V
  21.   #10 = Utf8               Code
  22.   #11 = Utf8               LineNumberTable
  23.   #12 = Utf8               main
  24.   #13 = Utf8               ([Ljava/lang/String;)V
  25.   #14 = Utf8               SourceFile
  26.   #15 = Utf8               ByteCodeTest.java
  27.   #16 = NameAndType        #8:#9          // "<init>":()V
  28.   #17 = Utf8               com/minnesota/practice/test/ByteCodeTest
  29.   #18 = Utf8               java/lang/Object
  30.   #19 = Utf8               byte dancing
  31. {
  32.   public com.minnesota.practice.test.ByteCodeTest();
  33.     descriptor: ()V
  34.     flags: ACC_PUBLIC
  35.     Code:
  36.       stack=1, locals=1, args_size=1
  37.          0: aload_0
  38.          1: invokespecial #1                  // Method java/lang/Object."<init>":()V
  39.          4: return
  40.       LineNumberTable:
  41.         line 3: 0
  42.   public static void main(java.lang.String[]);
  43.     descriptor: ([Ljava/lang/String;)V
  44.     flags: ACC_PUBLIC, ACC_STATIC
  45.     Code:
  46.       stack=2, locals=4, args_size=1
  47.          0: iconst_1
  48.          1: istore_1
  49.          2: iconst_2
  50.          3: istore_2
  51.          4: iload_1
  52.          5: iload_2
  53.          6: iadd
  54.          7: istore_3
  55.          8: return
  56.       LineNumberTable:
  57.         line 6: 0
  58.         line 7: 2
  59.         line 8: 4
  60.         line 9: 8
  61. }
  62. SourceFile: "ByteCodeTest.java"
复制代码
todo 这块还没看懂
待续!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表