首页 > 其他分享 >5 字节码文件结构

5 字节码文件结构

时间:2022-10-25 20:45:24浏览次数:33  
标签:info 文件 java 常量 Utf8 结构 ByteCodeTest 字节

目录

1 Class类文件结构

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

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代码

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 内容浏览:

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 这块还没看懂

待续!

标签:info,文件,java,常量,Utf8,结构,ByteCodeTest,字节
From: https://www.cnblogs.com/knowledgeispower/p/16826239.html

相关文章

  • Python 文件
    1.读取整个文件我们首先在存放代码的位置下新建一个名为data的txt文件,并在里面存放一些数据。  【实例】:withopen("D:\Code\Python\data.txt",encoding='UTF-8')......
  • jstack 解决dump导出JAVA堆内存文件报错
     报错信息:~]$jstack283513>283513.dump283513:Unabletoopensocketfile:targetprocessnotrespondingorHotSpotVMnotloadedThe-Foptioncanbeused......
  • 解决Windows 10无法安装.msi文件的办法
    问题描述:打开.msi文件提示打开方式,无法安装。 解决方法:1.Windows+R键打开运行,输入services.msc回车,找到WindowsInstallers服务器,开启此服务。  2.以管理员身份......
  • 【数据结构-栈】栈的基本操作
    目录1顺序表实现栈1.1定义1.2初始化1.3栈空判断1.4栈满判断1.5出栈1.6入栈1.7读栈顶元素2单向链表实现栈2.1定义2.2初始化2.3栈空判断2.4栈满判断2.5出栈2.6......
  • JAVA dump出了hprof文件可供分析,可以用MAT工具进行分析
    用MAT打开后,可以看到分析情况    由此也可以知道,是因为list的容量过大而导致OOM,可以根据此来进行优化代码或者JVM参数。如果是由内存泄漏导致的,也可以通过工......
  • 一个简洁的文件传输共享系统
    因为手机电脑穿文件不方便,共享文件给被人不方便,所以写了个这东西。使用方法  系统界面  文件路径 github链接 https://github.com/mrwoowoo/transfer......
  • java生成uuid(java生成word文件)
    JAVAJDK提供的一个自动生成主键UUID.randomUUID()的方法它永远都不会重复嘛??关于是否重复,首先要说一下uuid生成的原理UUID是指在一台机器上生成的数字,它保证对在同一时空......
  • 前端文件下载问题
    1,下载后端返回的blob文件//下载blob文件(注意请求需要加上responseType:'blob')exportconstdownloadBlob=(res:Blob,fileName:string):void=>{letblo......
  • LTE/NR物理层帧结构
    1.LTE学习笔记五:LTE两种帧结构https://blog.csdn.net/jyqxerxes/article/details/78988526?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blo......
  • 浅谈文件加密系统那些事...
    ​近来,流程信息化部对文档加密系统的调研工作正在如火如荼的展开。那么为什么我们一定要对文档进行加密呢?文档加密是否会给我们的日常工作带来许多关卡?今天,我们来一起聊一聊......