小小小幸运 发表于 2022-10-25 20:20:04

5 字节码文件结构

目录

[*]1 Class类文件结构
[*]2 常量池

[*]2.1 字面量
[*]2.2 符号引用
[*]2.3 常量的表结构

[*]2.3.1 表结构的属性解析
[*]2.3.2 17种常量的表结构解析

[*]2.4 javap分析字节码文件


1 Class类文件结构


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

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

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

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

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

常量池中每一项常量都是一个表,一共有17种表结构,因此一共有17种常量。17种常量类型如下所示:
https://img2022.cnblogs.com/blog/2327408/202210/2327408-20221025202857533-272132295.jpg
https://img2022.cnblogs.com/blog/2327408/202210/2327408-20221025202905387-1560668697.jpg
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标志位
https://img2022.cnblogs.com/blog/2327408/202210/2327408-20221025202919041-2084555069.jpg
https://img2022.cnblogs.com/blog/2327408/202210/2327408-20221025202926201-1576272179.jpg
(JDK7增加的三种:CONSTANT_MethodHandle_info、CONSTANT_MethodType_info和 CONSTANT_InvokeDynamic_info,JDK11中又增加了第四种常量CONSTANT_Dynamic_info,在后续章节中详细解)
2.4 javap分析字节码文件

javap:用于分析Class文件字节码的工具,在JDK的bin目录中。
javap -verbose 输出字节码的内容。
测试的java代码:
package com.minnesota.practice.test;

public class ByteCodeTest {
    private static final String DREAM = "byte dancing";
    public static void main(String[] args) {
      int a = 1;
      int b = 2;
      int c = a+b;
    }
}ByteCodeTest.class 内容浏览:
https://img2022.cnblogs.com/blog/2327408/202210/2327408-20221025202944918-1239086283.jpg
javap -verbose ByteCodeTest.class 解析后:
javap -verbose ByteCodeTest.class

输出结果:
Classfile /路径脱敏/ByteCodeTest.class
Last modified 2022-10-25; size 396 bytes
MD5 checksum be72a2ed3bf8578da63968ce35880d3d
Compiled from "ByteCodeTest.java"
public class com.minnesota.practice.test.ByteCodeTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#16         // java/lang/Object."<init>":()V
   #2 = Class            #17            // com/minnesota/practice/test/ByteCodeTest
   #3 = Class            #18            // java/lang/Object
   #4 = Utf8               DREAM
   #5 = Utf8               Ljava/lang/String;
   #6 = Utf8               ConstantValue
   #7 = String             #19            // byte dancing
   #8 = Utf8               <init>
   #9 = Utf8               ()V
#10 = Utf8               Code
#11 = Utf8               LineNumberTable
#12 = Utf8               main
#13 = Utf8               ([Ljava/lang/String;)V
#14 = Utf8               SourceFile
#15 = Utf8               ByteCodeTest.java
#16 = NameAndType      #8:#9          // "<init>":()V
#17 = Utf8               com/minnesota/practice/test/ByteCodeTest
#18 = Utf8               java/lang/Object
#19 = Utf8               byte dancing
{
public com.minnesota.practice.test.ByteCodeTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
      line 3: 0

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=1
         0: iconst_1
         1: istore_1
         2: iconst_2
         3: istore_2
         4: iload_1
         5: iload_2
         6: iadd
         7: istore_3
         8: return
      LineNumberTable:
      line 6: 0
      line 7: 2
      line 8: 4
      line 9: 8
}
SourceFile: "ByteCodeTest.java"todo 这块还没看懂
待续!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 5 字节码文件结构