`

Class文件的格式

 
阅读更多
以下是以实例的方式分析了字节码文件的格式,对javac编译后的文件进行分析
源码:
public class TestClassStructer {

    public String getMy(){
        String a = "232kld";
        try{
            a = "32233232";
        }catch(Exception ex){
            ex.printStackTrace();
        }
        
        return a;
    }
}
 
字节码:


 
 
  1. U4:[CA FE BA BY] 前4个字节,代表魔数,class文件选用了CAFEBABY当作魔数
  2. U2:[00 00] 小版本号,从0-65535,一般情况下小版本号为0
  3. U2:[00 33] 大版本号,当前值为51,为jdk1.7编译的class版本,每个大jdk版本对应一个值,幅度为1.
  4. U2:[00 22] 常量池个数,该数值计数从1开始,目前代表存在33个常量池
  5. U1:[07] 常量池的项目类型 Contant_Class_info,类或接口的符号引用。每种常量类型都有自己的格式。 1
  6. U2:[00 02] 此处为name_index,代表常量池的第二位
Contant_class_info为[U1,U2],代表如下
U1 标志位,代表常量池项目符号中的值,CONSTANT_Class_info值为7
代表了类或接口的符号引用
U2 name_index,它指向常量池的索引值
 
  1. U1:[01] 常量池的项目类型,CONSTANT_Utf8_info,代表UTF-8编码的字符串 2
  2. U2:[00 11]
  3. U17:[54 65 73 74 43 6C 61 73 73 53 74 72 75 63 74 65 72] 代表TestClassStructer
 
CONSTANT_Utf8_info格式如下:
U1 常量池的项目类型标志,01代表CONSTANT_Utf8_info,代表Utf-8编码的字符串
U2 字符串的长度
U? 根据字符串长度的字节数据
  1. U1:[07] 常量池的项目类型 CONSTANT_Class_info,类或接口的符号引用。 3
  2. U2:[00 04] 常量池的第4个索引
  3. U1:[01] 常量池的项目类型 CONSTANT_Utf8_info,utf8类型的字符串 4
  4. U2:[00 10]字符串的长度
  5. U16:[6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74],代表:java/lang/Object
  6. U1:[01] 常量池的项目类型 CONSTANT_Utf8_info,utf8类型的字符串 5
  7. U2:[00 06] 字符串的长度
  8. U6:[3C 69 6E 69 74 3E] 代表:<init>
  9. U1:[01] CONSTANT_Utf8_info utf8字符串 6
  10. U2:[00 03] 字符串长度
  11. U3:[28 29 56] 代表:()V
  12. U1:[01] CONSTANT_Utf8_info,utf8类型的字符串 7
  13. U2:[00 04] 字符串的长度
  14. U4:[43 6F 64 65] 代表:Code
  15. U1:[0A] CONSTANT_Methodref_info,类中方法的符号引用 8
  16. U2:[00 03] 指向声明方法的类描述CONSTANT_Class_info的索引项,此处为序号10
  17. U2:[00 09] 指向名称及类型描述的CONSTANT_NameAndType的索引项
U1 常量池的项目类型标志,0A代表CONSTANT_Methodref_info
代表类中方法的符号引用
U2 指向声明方法的类描述CONSTANT_Class_info的索引项
U2 指向名称及类型描述符的CONSTANT_NameAndType的索引项
  1. U1:[0C] 常量池的项目类型,CONSTANT_NameAndType_info,字段或方法的部分描述符 9
  2. U2:[00 05] 指向该字段或方法名称变量的索引项 代表:<init>
  3. U2:[00 06] 指向该字段或方法描述符的索引项 代表:()V
U1 方法或字段的部分描述项
U2 指向该字段或方法名称变量的索引项
U2 指向该字段或方法描述的索引项
  1. U1:[01] utf8的字符串常量 10
  2. U2:[00 0F] 字符串的长度
  3. U16:[4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65] 代表:LineNumberTable
  4. U1:[01]utf8的字符串 11
  5. U2:[00 12] 字符串的长度
  6. U18:[4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65] 代表:LocalVariableTable
  7. U1:[01] utf8的字符串 12
  8. U2: [00 04] 字符串的长度
  9. U4:[74 68 69 73] this
  10. U1:[01] 字符串 13
  11. U2:[00 13] 字符串的长度
  12. U19: [4C 54 65 73 74 43 6C 61 73 73 53 74 72 75 63 74 65 72 3B] 代表LTestClassStructer
  13. U1:[01] utf8的字符串 14
  14. U2:[00 05] 字符串的长度
  15. U5:[67 65 74 4d 79] 代表getMy
  16. U1:[01]utf8的字符串 15
  17. U2:[00 14] 字符串的长度
  18. U20:[28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B]代表()Ljava/lang/String
  19. U1:[08] CONSTANT_String_info字符串型字面量 16
  20. U2:[00 11] 指向字符串字面量的索引
  21. U1:[01] utf8的字符串 17
  22. U2:[00 06] 字符串的长度
  23. U6:[32 33 32 6B 6C 64] 代表232kld
  24. U1:[08]CONSTANT_String_info 常量池类型的字符串型字面量 18
  25. U2:[00 13] 指向字符串字面量的索引
  26. U1:[01] utf8字符串 19
  27. U2:[00 08] 字符串的长度
  28. U8:[33 32 32 33 33 32 33 32] 32233232
  29. U1:[0A] 类中方法的符号索引 20
  30. U2:[00 15] 指向声明方法的类描述符的索引值
  31. U2:[00 17]指向名称及类型方法描述符的索引值
  32. U1:[07] 类或接口的符号引用 21
  33. U2:[00 16] 索引的位置
  34. U1:[01] utf8编码的字符串 22
  35. U2:[00 13] 字符串的长度19
  36. U19: [6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E] 代表java/lang/Exception
  37. U1: [0C] 字段或方法的部分描述符 23
  38. U2:[00 18] 指向字段或方法名称常量项的索引值 代表:
  39. U2:[00 06] 指向该字段或方法描述符常量池的索引值 代表:()V
  40. U1:[01] utf8编码的字符串 24
  41. U2:[00 0F] 字符串的长度
  42. U16: [70 72 69 6E 74 53 74 61 63 6B 54 72 61 63 65] 代表printStackTrace
  43. U1:[01] utf编码的字符串 25
  44. U2:[00 01]字符串的长度
  45. U1:[61] 代表:a
  46. U1:[01]utf8编码的字符串 26
  47. U2:[00 12]字符串的长度
  48. U18:[4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B] 代表Ljava/lang/String
  49. U1:[01] utf8编码的字符串 27
  50. U2:[00 02] 字符串的长度
  51. U2:[65 78] 字符串,代表:ex
  52. U1:[01] utf8编码的字符串 28
  53. U2:[00 15] 字符串的长度
  54. U21:[4C 6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E 3B] 代表:L/java/lang/Exception;
  55. U1:[01] utf8编码的字符串 29
  56. U2:[00 0D] 字符串的长度
  57. U14:[53 74 61 63 6B 4D 61 70 54 61 62 6C 65] 代表:StackMapTable
  58. U1:[07]接口或类的符号引用 30
  59. U2:[00 1F] 索引的位置
  60. U1:[01]utf8编码的字符串 31
  61. U2:[00 10]字符串的长度
  62. U16: [6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67] java/lang/String
  63. U1:[01] utf8编码的字符串32
  64. U2:[00 0A] 字符串的长度
  65. U10:[53 6F 75 72 63 65 46 69 6C 65] 代表:SourceFile
  66. U1:[01] utf8编码的字符串33
  67. U2:[00 16] 字符串的长度
  68. U22:[54 65 73 74 43 6C 61 73 73 53 74 72 75 63 74 65 72 2E 6A 61 76 61] 代表 :TestClassStrtucter.java
  69. U2:[00 21] access_flags 共16个标记位,代表ACC_PUBLIC ACC_SUPER
  70. U2:[00 01] this_class指向CONSTANT_Class_info的索引
  71. U2:[00 03] super_class指向CONSTANT_Class_info的索引 java/lang/Object
  72. U2:[00 00] interfaces_count接口数量
  73. U2:[00 00] fields_count字段数量
  74. U2:[00 02] methods_count方法数量,方法为2个
  75. U2:[00 01] 访问标志 代表ACC_PUBLIC
  76. U2:[00 05] 名称索引,指向常量池中的第五项,代表<init>
  77. U2:[00 06] 描述符索引,指向常量池中的第六项,代表()V
  78. U2:[00 01]属性个数
  79. U2:[00 07]指向常量池中的索引值,代表Code
  80. U4:[00 00 00 2F] 代码的长度(属性的长度)47
  81. U2:[00 01] max_stack
  82. U2:[00 01] max_locals
  83. U4:[00 00 00 05] code长度
  84. U5:[2A B7 00 0B B1] code
  85. U2:[00 00]异常表长度
  86. U2:[00 02]属性表的长度
  87. U2:[00 0A] LineNumber的索引值
  88. U4:[00 00 00 06]属性的长度
  89. U2:[00 01] linenumber表的长度
  90. U2:[00 00]start_pc
  91. U2:[00 02]line_number
  92. U2:[00 0B]代表LocalVariableTable
  93. U4:[00 00 00 0C] 属性的长度
  94. U2:[00 01] local_variable_length
  95. U2:[00 00] start_pc
  96. U2:[00 05] length
  97. U2:[00 0C] name_index 代表: this
  98. U2:[00 0D] descriptor_index 代表:LTestClassStructer
  99. U2:[00 01] ACC_PUBLIC 方法的访问标识
  100. U2:[00 0E]方法名称指向常量池中的索引项 代表:getMy
  101. U2:[00 0F]方法描述符指向常量池中的索引项,代表:()Ljava/lang/String
  102. U2:[00 01]属性的个数
  103. U2:[00 07] 属性名称指向常量池中的索引项,代表:code
  104. U4:[00 00 00 7F] 属性的长度:117

 
  1. U2:[00 01]max_stack
  2. U2:[00 03]max_locals
  3. U4:[00 00 00 10]code的长度
  4. U16:[12 10 4C 12 12 4C A7 00 08 4D 2C B6 00 14 2B B0]
  5. U2:[00 01]异常表的长度
  6. U2:[00 03] start_pc
  7. U2:[00 06] end_pc
  8. U2::[00 09] handler_pc
  9. U2:[00 15] catch_type 代表:java/lang/Exception
  10. U2:[00 03]属性表的长度
  11. U2:[00 0A]LineNumber的索引值
  12. U4:[00 00 00 16]属性的长度
  13. U2:[00 05]LineNumber表的长度
  14. U2:[00 00] start_pc
  15. U2:[00 05] length
  16. U2:[00 03] start_pc
  17. U2:[00 07] end_pc
  18. U2:[00 06] start_pc
  19. U2:[00 08} end_pc
  20. U2:[00 0A] start_pc
  21. U2:[00 09] end_pc
  22. U2:[00 0E]start_pc
  23. U2:[00 0C] end_pc
  24. U2:[00 0B] 代表LocalVariable
  25. U4:[00 00 00 20] 长度
  26. U2:[00 03] local_variable_length
  27. U2:[00 00] start_pc
  28. U2:[00 16] length
  29. U2:[00 0C] name_index 代表: this
  30. U2:[00 0D] descriptor_index 代表:LTestClassStructer
  31. U4:[00 00] index
  32. U2:[00 03] start_pc
  33. U2:[00 0D]length
  34. U2:[00 19] name_index 代表:a
  35. U2:[00 1A] descriptor_indx 代表:Ljava/lang/String
  36. U2:[00 01] index,变量的索引位置
  37. U2:[00 0A] start_pc
  38. U2:[00 04] length
  39. U2:[00 1B]name_index的位置,代表:ex
  40. U2:[00 1C] descriptor_index,描述符的位置,L/java/lang/Exception
  41. U2:[00 02]变量的索引位置
  42. U2:[00 1D] name_index的位置,代表:StackMapTable
  43. U4:[00 00 00 13] 属性的长度
  44. U19:[FF 00 09 00 02 07 00 01 07 00 1E 00 01 07 00 15 04]
  45. U2:[00 01] 不确定?
  46. U2:[00 20] 常量池索引:SourceFile
  47. U4:[00 00 00 02] 不确定?
  48. U2:[00 21] 常量池索引:TestClassStrtucter.java
  • 大小: 16.8 KB
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    Class文件格式

    ### Class文件格式详解 #### 一、概述 在Java编程语言中,编译后的源代码会生成`.class`文件,这种文件格式对于Java程序的执行至关重要。本文将深入探讨Class文件格式的基本结构、组成部分以及其如何支持Java...

    class文件格式分析实验

    《深入剖析Java Class文件格式》 Java程序在编译后会生成后缀为`.class`的文件,这些文件包含了运行时所需的所有信息。本实验旨在通过详细分析一个名为`Test.class`的文件,揭示其内部结构,从而理解Java类文件的...

    Java Class文件格式详解1

    在深入讲解Class文件格式之前,我们需要理解Java字节码的概念,它是一种平台无关的中间语言,使得Java程序可以在任何支持JVM的设备上运行。 1. **总体格式** Class文件的结构遵循一个固定的模板,由多个字段组成...

    Java class文件格式之数据类型(二)_动力节点Java学院整理

    Java class文件格式是Java虚拟机(JVM)执行的基础,它包含了构成Java程序的基本元素。在本文中,我们将深入探讨class文件中的数据类型,特别是CONSTANT_Class_info和CONSTANT_Fieldref_info这两个重要的数据项。 ...

    java class文件格式学习笔记1

    Java Class文件是Java虚拟机(JVM)执行的二进制格式,它是程序的核心组成部分,包含了编译后的字节码指令。这篇学习笔记主要探讨了Class文件的结构、...理解Class文件格式对于深入理解Java虚拟机的工作原理至关重要。

    class文件格式

    java class文件格式详解,pdf格式,6M

    Class 文件格式.png

    java虚拟机中,Class文件格式的详细分解图例,建议收藏保存

    Class文件格式.xmind

    以思维导图的方式概括了java class文件的结构。其中用位置描述了各个结构出现的顺序。为JVM的一个分支。

    Java class文件格式1

    Class文件的格式是严格定义的,确保了JVM能够正确解析和执行其中的代码。在JVM规范第四章中,详细描述了Class文件的结构,主要包括以下几个关键部分: 1. **魔数(Magic Number)**:每个Class文件的开头都有一个4...

    Java class文件格式之方法_动力节点Java学院整理

    Java Class文件是Java程序编译后的二进制表示形式,它是Java虚拟机(JVM)运行的基础。本文将详细解析Class文件中的方法部分,帮助读者理解其结构和功能。 首先,Class文件由多个结构化的数据单元组成,其中包括`...

    class文件查看器.rar

    而"class文件查看器"则提供了一个友好的界面,让开发者无需深入了解class文件格式的细节,就能查看并理解这些内部结构。它支持查看类的元数据,包括类名、父类、接口、方法签名、常量池等。此外,它还允许用户深入到...

    class文件结构组成.doc

    每个部分紧密相连,不存在任何无意义的填充字节,这使得Class文件格式既紧凑又高效。 #### 二、Class文件主要内容解析 1. **Magic Number (魔数)** - 魔数是Class文件的前四个字节,值为`0xCAFEBABE`。它的主要...

    Java class文件格式之数据类型_动力节点Java学院整理

    在探讨Java class文件格式时,数据类型的处理是其中非常核心和基础的部分。Java class文件格式由Oracle官方定义,是Java虚拟机(JVM)执行Java程序时所依赖的文件格式。数据类型在class文件格式中扮演着非常重要的...

    深入理解Java class文件格式_动力节点Java学院整理

    Java class文件格式是Java虚拟机(JVM)能够识别和执行的基本单元,它是Java源代码编译后的结果。深入理解class文件格式对于开发者而言至关重要,因为它不仅有助于理解JVM的工作原理,还能帮助我们深入理解Java语言...

    Java class文件格式总结_动力节点Java学院整理

    Java Class文件格式是Java虚拟机(JVM)能够识别和执行的基础。它是Java源代码经过编译后的二进制表示,包含了程序的结构、方法、字段等信息,使得JVM可以解析并执行其中的指令。深入理解Class文件格式对于开发者来...

    class文件结构(简单class文件)

    魔术数是class文件的开头四个字节,值为0xCAFEBABE,这是JVM用来识别class文件格式的一种机制。紧随魔术数之后,是两个字节的版本信息,分别表示主版本号和次版本号,主版本号表示class文件可以被执行的JVM版本,次...

    Java二进制Class文件格式解析

    在深入Class文件格式之前,我们需要理解三个关键概念: 1. 数据类型:在Class文件中,数据以特定的无符号类型表示,包括u1(1字节)、u2(2字节)和u4(4字节)。这些基本类型构成了Class文件数据的基础。 2. 表...

    Java class文件格式之常量池_动力节点Java学院整理

    Java class文件格式之常量池 Java class文件格式之常量池是Java虚拟机(JVM)加载和执行Java类文件的核心组件之一。常量池是class文件的一部分,存储着Java类文件中的各种常量信息,如字符串常量、类名、方法名、...

    Java class文件格式之访问标志信息_动力节点Java学院整理

    Java class文件格式是Java虚拟机(JVM)运行的基础,其中访问标志信息(access_flags)是定义类或接口访问权限及特性的关键部分。访问标志信息位于class文件的结构中,紧随常量池之后,占据2个字节的空间。 访问...

Global site tag (gtag.js) - Google Analytics