以下是以实例的方式分析了字节码文件的格式,对javac编译后的文件进行分析
源码:
public class TestClassStructer { public String getMy(){ String a = "232kld"; try{ a = "32233232"; }catch(Exception ex){ ex.printStackTrace(); } return a; } }
字节码:
- U4:[CA FE BA BY] 前4个字节,代表魔数,class文件选用了CAFEBABY当作魔数
- U2:[00 00] 小版本号,从0-65535,一般情况下小版本号为0
- U2:[00 33] 大版本号,当前值为51,为jdk1.7编译的class版本,每个大jdk版本对应一个值,幅度为1.
- U2:[00 22] 常量池个数,该数值计数从1开始,目前代表存在33个常量池
- U1:[07] 常量池的项目类型 Contant_Class_info,类或接口的符号引用。每种常量类型都有自己的格式。 1
- U2:[00 02] 此处为name_index,代表常量池的第二位
Contant_class_info为[U1,U2],代表如下
U1 | 标志位,代表常量池项目符号中的值,CONSTANT_Class_info值为7 代表了类或接口的符号引用 |
U2 | name_index,它指向常量池的索引值 |
- U1:[01] 常量池的项目类型,CONSTANT_Utf8_info,代表UTF-8编码的字符串 2
- U2:[00 11]
- 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? | 根据字符串长度的字节数据 |
- U1:[07] 常量池的项目类型 CONSTANT_Class_info,类或接口的符号引用。 3
- U2:[00 04] 常量池的第4个索引
- U1:[01] 常量池的项目类型 CONSTANT_Utf8_info,utf8类型的字符串 4
- U2:[00 10]字符串的长度
- U16:[6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74],代表:java/lang/Object
- U1:[01] 常量池的项目类型 CONSTANT_Utf8_info,utf8类型的字符串 5
- U2:[00 06] 字符串的长度
- U6:[3C 69 6E 69 74 3E] 代表:<init>
- U1:[01] CONSTANT_Utf8_info utf8字符串 6
- U2:[00 03] 字符串长度
- U3:[28 29 56] 代表:()V
- U1:[01] CONSTANT_Utf8_info,utf8类型的字符串 7
- U2:[00 04] 字符串的长度
- U4:[43 6F 64 65] 代表:Code
- U1:[0A] CONSTANT_Methodref_info,类中方法的符号引用 8
- U2:[00 03] 指向声明方法的类描述CONSTANT_Class_info的索引项,此处为序号10
- U2:[00 09] 指向名称及类型描述的CONSTANT_NameAndType的索引项
U1 | 常量池的项目类型标志,0A代表CONSTANT_Methodref_info 代表类中方法的符号引用 |
U2 | 指向声明方法的类描述CONSTANT_Class_info的索引项 |
U2 | 指向名称及类型描述符的CONSTANT_NameAndType的索引项 |
- U1:[0C] 常量池的项目类型,CONSTANT_NameAndType_info,字段或方法的部分描述符 9
- U2:[00 05] 指向该字段或方法名称变量的索引项 代表:<init>
- U2:[00 06] 指向该字段或方法描述符的索引项 代表:()V
U1 | 方法或字段的部分描述项 |
U2 | 指向该字段或方法名称变量的索引项 |
U2 | 指向该字段或方法描述的索引项 |
- U1:[01] utf8的字符串常量 10
- U2:[00 0F] 字符串的长度
- U16:[4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65] 代表:LineNumberTable
- U1:[01]utf8的字符串 11
- U2:[00 12] 字符串的长度
- U18:[4C 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65] 代表:LocalVariableTable
- U1:[01] utf8的字符串 12
- U2: [00 04] 字符串的长度
- U4:[74 68 69 73] this
- U1:[01] 字符串 13
- U2:[00 13] 字符串的长度
- U19: [4C 54 65 73 74 43 6C 61 73 73 53 74 72 75 63 74 65 72 3B] 代表LTestClassStructer
- U1:[01] utf8的字符串 14
- U2:[00 05] 字符串的长度
- U5:[67 65 74 4d 79] 代表getMy
- U1:[01]utf8的字符串 15
- U2:[00 14] 字符串的长度
- U20:[28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B]代表()Ljava/lang/String
- U1:[08] CONSTANT_String_info字符串型字面量 16
- U2:[00 11] 指向字符串字面量的索引
- U1:[01] utf8的字符串 17
- U2:[00 06] 字符串的长度
- U6:[32 33 32 6B 6C 64] 代表232kld
- U1:[08]CONSTANT_String_info 常量池类型的字符串型字面量 18
- U2:[00 13] 指向字符串字面量的索引
- U1:[01] utf8字符串 19
- U2:[00 08] 字符串的长度
- U8:[33 32 32 33 33 32 33 32] 32233232
- U1:[0A] 类中方法的符号索引 20
- U2:[00 15] 指向声明方法的类描述符的索引值
- U2:[00 17]指向名称及类型方法描述符的索引值
- U1:[07] 类或接口的符号引用 21
- U2:[00 16] 索引的位置
- U1:[01] utf8编码的字符串 22
- U2:[00 13] 字符串的长度19
- U19: [6A 61 76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 6E] 代表java/lang/Exception
- U1: [0C] 字段或方法的部分描述符 23
- U2:[00 18] 指向字段或方法名称常量项的索引值 代表:
- U2:[00 06] 指向该字段或方法描述符常量池的索引值 代表:()V
- U1:[01] utf8编码的字符串 24
- U2:[00 0F] 字符串的长度
- U16: [70 72 69 6E 74 53 74 61 63 6B 54 72 61 63 65] 代表printStackTrace
- U1:[01] utf编码的字符串 25
- U2:[00 01]字符串的长度
- U1:[61] 代表:a
- U1:[01]utf8编码的字符串 26
- U2:[00 12]字符串的长度
- U18:[4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B] 代表Ljava/lang/String
- U1:[01] utf8编码的字符串 27
- U2:[00 02] 字符串的长度
- U2:[65 78] 字符串,代表:ex
- U1:[01] utf8编码的字符串 28
- U2:[00 15] 字符串的长度
- 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;
- U1:[01] utf8编码的字符串 29
- U2:[00 0D] 字符串的长度
- U14:[53 74 61 63 6B 4D 61 70 54 61 62 6C 65] 代表:StackMapTable
- U1:[07]接口或类的符号引用 30
- U2:[00 1F] 索引的位置
- U1:[01]utf8编码的字符串 31
- U2:[00 10]字符串的长度
- U16: [6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67] java/lang/String
- U1:[01] utf8编码的字符串32
- U2:[00 0A] 字符串的长度
- U10:[53 6F 75 72 63 65 46 69 6C 65] 代表:SourceFile
- U1:[01] utf8编码的字符串33
- U2:[00 16] 字符串的长度
- 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
- U2:[00 21] access_flags 共16个标记位,代表ACC_PUBLIC ACC_SUPER
- U2:[00 01] this_class指向CONSTANT_Class_info的索引
- U2:[00 03] super_class指向CONSTANT_Class_info的索引 java/lang/Object
- U2:[00 00] interfaces_count接口数量
- U2:[00 00] fields_count字段数量
- U2:[00 02] methods_count方法数量,方法为2个
- U2:[00 01] 访问标志 代表ACC_PUBLIC
- U2:[00 05] 名称索引,指向常量池中的第五项,代表<init>
- U2:[00 06] 描述符索引,指向常量池中的第六项,代表()V
- U2:[00 01]属性个数
- U2:[00 07]指向常量池中的索引值,代表Code
- U4:[00 00 00 2F] 代码的长度(属性的长度)47
- U2:[00 01] max_stack
- U2:[00 01] max_locals
- U4:[00 00 00 05] code长度
- U5:[2A B7 00 0B B1] code
- U2:[00 00]异常表长度
- U2:[00 02]属性表的长度
- U2:[00 0A] LineNumber的索引值
- U4:[00 00 00 06]属性的长度
- U2:[00 01] linenumber表的长度
- U2:[00 00]start_pc
- U2:[00 02]line_number
- U2:[00 0B]代表LocalVariableTable
- U4:[00 00 00 0C] 属性的长度
- U2:[00 01] local_variable_length
- U2:[00 00] start_pc
- U2:[00 05] length
- U2:[00 0C] name_index 代表: this
- U2:[00 0D] descriptor_index 代表:LTestClassStructer
- U2:[00 01] ACC_PUBLIC 方法的访问标识
- U2:[00 0E]方法名称指向常量池中的索引项 代表:getMy
- U2:[00 0F]方法描述符指向常量池中的索引项,代表:()Ljava/lang/String
- U2:[00 01]属性的个数
- U2:[00 07] 属性名称指向常量池中的索引项,代表:code
- U4:[00 00 00 7F] 属性的长度:117
- U2:[00 01]max_stack
- U2:[00 03]max_locals
- U4:[00 00 00 10]code的长度
- U16:[12 10 4C 12 12 4C A7 00 08 4D 2C B6 00 14 2B B0]
- U2:[00 01]异常表的长度
- U2:[00 03] start_pc
- U2:[00 06] end_pc
- U2::[00 09] handler_pc
- U2:[00 15] catch_type 代表:java/lang/Exception
- U2:[00 03]属性表的长度
- U2:[00 0A]LineNumber的索引值
- U4:[00 00 00 16]属性的长度
- U2:[00 05]LineNumber表的长度
- U2:[00 00] start_pc
- U2:[00 05] length
- U2:[00 03] start_pc
- U2:[00 07] end_pc
- U2:[00 06] start_pc
- U2:[00 08} end_pc
- U2:[00 0A] start_pc
- U2:[00 09] end_pc
- U2:[00 0E]start_pc
- U2:[00 0C] end_pc
- U2:[00 0B] 代表LocalVariable
- U4:[00 00 00 20] 长度
- U2:[00 03] local_variable_length
- U2:[00 00] start_pc
- U2:[00 16] length
- U2:[00 0C] name_index 代表: this
- U2:[00 0D] descriptor_index 代表:LTestClassStructer
- U4:[00 00] index
- U2:[00 03] start_pc
- U2:[00 0D]length
- U2:[00 19] name_index 代表:a
- U2:[00 1A] descriptor_indx 代表:Ljava/lang/String
- U2:[00 01] index,变量的索引位置
- U2:[00 0A] start_pc
- U2:[00 04] length
- U2:[00 1B]name_index的位置,代表:ex
- U2:[00 1C] descriptor_index,描述符的位置,L/java/lang/Exception
- U2:[00 02]变量的索引位置
- U2:[00 1D] name_index的位置,代表:StackMapTable
- U4:[00 00 00 13] 属性的长度
- U19:[FF 00 09 00 02 07 00 01 07 00 1E 00 01 07 00 15 04]
- U2:[00 01] 不确定?
- U2:[00 20] 常量池索引:SourceFile
- U4:[00 00 00 02] 不确定?
- U2:[00 21] 常量池索引:TestClassStrtucter.java
相关推荐
这篇文档是摘自深入理解Java虚拟机的第六章内容,为了更好的学习,特意整理一份电子版,方便学习。
自己结合class文件格式做的一个小实验,尽管小能直观的展示class文件内部的构造,这个文档对class文件中的每个字节都多了分析
java class文件格式详解,pdf格式,6M
java虚拟机中,Class文件格式的详细分解图例,建议收藏保存
Javaclass文件格式之访问标志信息——动力节点共6页.pdf.zip
以思维导图的方式概括了java class文件的结构。其中用位置描述了各个结构出现的顺序。为JVM的一个分支。
Class文件格说明。。。
在JVM虚拟机规范第四章中规定了class文件必须是一个固定的结构,如下所示:在JVM规范中 u1 、 u2 、 u4 分别表示的是1、2、4个字节的无符号数,
2.2 major_version.minor_versionmajor_version.minor_version合在一起形成当前.class文件的版本号,
NULL 博文链接:https://plkong.iteye.com/blog/1680902
* 主要用于存储以下内容: * 1、字面量,包括文本字符串、被申明为final类型的常量等 * 2、符号引用:类或是接口的全限定名称、方法以及字段的名称及描述符
主要介绍了Java class文件格式之数据类型的相关资料,需要的朋友可以参考下
解码class文件格式
轻松方便的把class文件转化为java文件
2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键都可进行操作; 4、支持java语法的高亮显示; 使用说明: ======...
class文件打开工具不需要安装,直接将class文件拖拽到窗口即可
class文件解析器class文件解析器class文件解析器
主要介绍了Java class文件格式之属性详解,需要的朋友可以参考下
主要介绍了Java class文件格式总结的相关资料,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
class文件查看器,可以查看class文件,转译出代码.方便大家使用.(java工具类)简单的工具没这么多说明,说这些只是为了凑字数啦啦啦啦