00 0A 00 00 00 06 00 01
00 00 00 01
---00 0A:attribute_name_index=#10---->#10 = Utf8 LineNumberTable
---00 00 00 06:attribute_lenght=6
---00 01:line_number_table_length=1,表示这个LineNumberTable中有一条记录
---00 00 00 01:表示Test.java的第一行代码对应指令0--->0: aload_0
方法2:00 09 00 0B 00 0C 00 01
---00 09:access_flags=0x0008|0x0001=ACC_STATIC|ACC_PUBLIC
---00 0B:name_index=#11------>#11 = Utf8 main
---00 0C:descriptor_index=#12----->#12 = Utf8 ([Ljava/lang/String;)V
---00 01:arrtibutes_count=1,紧接着是attribute_info
方法2的code,非指令部分:
00 09 00 00 00 25 00 02 00 01 00 00 00 09
---00 09:attribute_name_index=#9----->#9 = Utf8 Code
---00 00 00 25:attribute_length=37,所以整个属性表的长度为43
---00 02:max_stack=2
---00 01:max_locals=1
---00 00 00 09:code_length=17
方法2的code,指令部分
B2 00 02----->getstatic #2:获取指定类的静态域,并且压入到栈顶,#2表示#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream;
12 03--->ldc #3,将“test”常量值从常量池中压入到栈顶
B6 00 04---->invokervirtual #4,调用实例方法,#4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V,即println方法
B1---->return
方法2的Exception:
00 00 ----->没有定义throw
方法2的attribute_count:
00 01 //方法最后有个属性
方法2的LineNumberTable:
00 0A 00 00 00 0A 00 02
----00 0A:attribute_name_index=#10------>#10 = Utf8 LineNumberTable
----00 00 00 0A:attribute_length=10
----00 02:line_number_table_lenght=2,表示lineNumberTable中有2条记录
00 00 00 04:Test.java第4行对应指令0 --->getstatic #2
00 08 00 05:Test.java第5行对应指令8----->8: return
8.sourceFile属性
00 01:当前class文件包含1个attribute_info
00 0D 00 00 00 02 00 0E
---00 0D:attribute_name_index=#13---->#13 = Utf8 SourceFile
---00 00 00 02:attribute_length=2
---00 0E:sourcefile_index=#14---->#14 = Utf8 Test.java
至此,class文件中的内容分析完毕!