分析了一下java的class文件內容,歡迎指正!
java:
public class TestClass {
protected int num;
private String userName;
public SHello ho;
public void sayHello(String hello){
System.out.println("Say "+hello);
}
public static void go(){
System.out.println("go");
}
static class SHello{
}
}
class文件:
括號內爲十進制
魔數(magic)
0x00000000-0x00000003:0xCAFEBABE class魔數
minor_version
0x00000004-0x00000005:0x0000 java子版本信息
major_version
0x00000006-0x00000007:0x0032(50) java主版本信息
constant_pool_count
0x00000008-0x00000009:0x0033(51,50個常量) 常量池常量總數
constant_pool
常量池信息:
1. 0x0000000A:0x0A(10) 類中方法的符號引用(CONSTANT_Methodref_info.tag)
0x0000000B-0x0000000C:0x000B(11) CONSTANT_Methodref_info.index(指向聲明方法的類描述符CONSTANT_Class_info的索引項)
0x0000000D-0x0000000E:0x001E(30) CONSTANT_Methodref_info.index(指向名稱及類型描述符CONSTANT_NameAndType的索引項)
2. 0x000000F:0x09(9) 字段的符號引用
0x00000010-0x00000011:0x001F(31)CONSTANT_Fieldref_info(指向聲明字段的類或接口描述符CONSTANT_Class_info的索引項)
0x00000012-0x00000013:0x0020(32)CONSTANT_Fieldref_info(指向字段描述符CONSTANT_NameAndType的索引項)
3. 0x00000014:0x07(7) 類或接口的符號引用
0x00000015-0x00000016:0x0021(33) 指向全限定名常量項的索引
4. 0x00000017:0x0A(10) 類中方法的符號引用(CONSTANT_Methodref_info.tag)
0x00000018-0x00000019:0x0003(3)CONSTANT_Methodref_info.index(指向聲明方法的類描述符CONSTANT_Class_info的索引項)
0x0000001A-0x0000001B:0x001E(30) CONSTANT_Methodref_info.index(指向名稱及類型描述符CONSTANT_NameAndType的索引項)
5. 0x0000001C:0x08(8) 字符串類型字面量
0x0000001D-0x000001E:0x0022(34):指向字符串字面量的索引
6. 0x0000001F:0x0A(10) 類中方法的符號引用(CONSTANT_Methodref_info.tag)
0x00000020-0x0000021:0x0003(3) CONSTANT_Methodref_info.index(指向聲明方法的類描述符CONSTANT_Class_info的索引項)
0x00000022-0x00000023:0x0023(35) CONSTANT_Methodref_info.index(指向名稱及類型描述符CONSTANT_NameAndType的索引項)
7. 0x00000024:0x0A(10) 類中方法的符號引用(CONSTANT_Methodref_info.tag)
0x00000025-0x00000026:0x0003 CONSTANT_Methodref_info.index(指向聲明方法的類描述符CONSTANT_Class_info的索引項)
0x00000027-0x00000028:0x0024(36) CONSTANT_Methodref_info.index(指向名稱及類型描述符CONSTANT_NameAndType的索引項)
8. 0x00000029:0x0A(10) 類中方法的符號引用(CONSTANT_Methodref_info.tag)
0x0000002A-0x000002B:0x0025(37) CONSTANT_Methodref_info.index(指向聲明方法的類描述符CONSTANT_Class_info的索引項)
0x0000002C-0x000002D:0x0026(38) CONSTANT_Methodref_info.index(指向名稱及類型描述符CONSTANT_NameAndType的索引項)
9. 0x0000002E:0x08字符串類型字面量
0x0000002F-0x00000030:0x001B(27) 指向字符串字面量的索引
10. 0x00000031:0x07類或接口的符號引用
0x00000032-0x00000033:0x0027(39) 指向全限定名常量項的索引
11. 0x00000034:0x07類或接口的符號引用
0x00000035-0x00000036:0x28(40) 指向全限定名常量項的索引
12. 0x00000037:0x07類或接口的符號引用
0x00000038-0x00000039:0x0029(41) 指向全限定名常量項的索引
13. 0x0000003A:0x01 UTF-8編碼的字符串
0x0000003B-0x0000003C:0x0006 UTF-8編碼的字符串佔用了的字節數
0x0000003D-0x00000042:0x5348656C6C6F(SHello) UTF-8編碼字符串內容
14. 0x00000043:0x01
0x00000044-0x00000045:0x000C(12)
0x00000046-0x00000051:0x496E6E6572436C6173736573(InnerClasses)
15. 0x00000052:0x01
0x00000053-0x00000054:0x0003
0x00000055-0x00000057:0x6E756D(num)
16. 0x00000058:0x01
0x00000059-0x0000005A:0x0001
0x0000005B:0x49(I)
17. 0x0000005C:0x01
0x0000005D-0x0000005E:0x0008
0x0000005F-0x00000066:0x757365724E616D65(userName)
18. 0x00000067:0x01
0x00000068-0x00000069:0x0012(18)
0x0000006A-0x0000007B:0x4C6A6176612F6C616E672F537472696E673B(Ljava/lang/String;)
19. 0x0000007C:0x01
0x000007D-0x0000007E:0x02
0x000007F-0x00000080:0x686F(ho)
20. 0x00000081:0x01
0x00000082-0x00000083:0x0012(18)
0x00000084-0x00000095:0x4C54657374436C617373245348656C6C6F3B(LtestClass$Shello;)
21. 0x00000096:0x01
0x00000097-0x00000098:0x0006
0x00000099-0x0000009E:0x3C696E69743E(<init>)
22. 0x0000009F:0x01
0x000000A0-0x000000A1:0x0003
0x000000A2-0x000000A4:0x282956(()V)
23. 0x000000A5:0x01
0x000000A6-0x000000A7:0x04
0x000000A8-0x000000AB:0x436F6465(Code)
24. 0x000000AC:0x01
0x000000AD-0x000000AE:0x000F(15)
0x000000AF-0x000000BD: 0x4C696E654E756D6265725461626C65(LineNumberTable)
25. 0x000000BE:0x01
0x000000BF-0x000000C0:0x0008
0x000000C1-0x000000C8:0x 73617948656C6C6F(sayHello)
26. 0x000000C9:0x01
0x000000CA-0x000000CB:0x0015(21)
0x000000CC-0x000000E0:0x284C6A6176612F6C616E672F537472696E673B2956((Ljava/lang/String;)V)
27. 0x000000E1:0x01
0x000000E2-0x000000E3:0x02
0x000000E4-0x000000E5:0x676F(go)
28. 0x000000E6:0x01
0x000000E7-0x000000E8:0x000A(10)
0x000000E9-0x000000F2:0x 536F7572636546696C65(SourceFile)
29. 0x000000F3:0x01
0x000000F4-0x000000F5:0x000E(14)
0x000000F6-0x00000103:0x 54657374436C6173732E6A617661(TestClass.java)
30. 0x00000104:0x0C(12) CONSTANT_NameAndType_info
0x00000105-0x00000106:0x0015(21) 指向該字段或方法名稱常量項的索引
0x00000107-0x00000108:0x0016(22) 指向該字段或方法描述符常量項的索引
31. 0x00000109:0x07CONSTANT_Class_info
0x0000010A-0x0000010B:0x002A(42)
32. 0x0000010C:0x0C(12)
0x0000010D-0x0000010E:0x002B(43)
0x0000010F-0x00000110:0x002C(44)
33. 0x00000111:0x01
0x00000112-0x00000113:0x0017(23)
0x00000114-0x0000012A:0x6A6176612F6C616E672F537472696E674275696C646572(java/lang/StringBuilder)
34. 0x0000012B:0x01
0x0000012C-0x0000012D:0x0004
0x0000012E-0x00000131:0x 53617920(Say )
35. 0x00000132:0x0C(12)
0x00000133-0x00000134:0x002D(45)
0x00000135-0x00000136:0x002E(46)
36. 0x00000137:0x0C(12)
0x00000138-0x00000139:0x002F(47)
0x0000013A-0x0000013B:0x0030(48)
37. 0x0000013C:0x07
0x0000013D-0x0000013E:0x0031(49)
38. 0x0000013F:0x0C
0x00000140-0x00000141:0x0032(50)
0x00000142-0x00000143:0x001A(26)
39. 0x0000144:0x01
0x00000145-0x00000146:0x0009
0x00000147-0x0000014F:0x 54657374436C617373(TestClass)
40. 0x00000150:0x01
0x00000151-0x00000152:0x0010(16)
0x00000153-0x00000162:0x 6A6176612F6C616E672F4F626A656374(java/lang/Object)
41. 0x00000163:0x01
0x00000164-0x00000165:0x0010(16)
0x00000166-0x00000175:0x 54657374436C617373245348656C6C6F(TestClass$SHello)
42. 0x00000176:0x01
0x00000177-0x00000178:0x0010(16)
0x00000179-0x00000188:0x 6A6176612F6C616E672F53797374656D(java/lang/System)
43. 0x00000189:0x01
0x0000018A-0x0000018B:0x0003
0x0000018C-0x0000018E:0x6F7574(out)
44. 0x0000018F:0x01
0x00000190-0x00000191:0x0015(21)
0x00000192-0x000001A6:0x4C6A6176612F696F2F5072696E7453747265616D3B(Ljava/io/PrintStream;)
45. 0x000001A7:0x01
0x000001A8-0x000001A9:0x0006
0x000001AA-0x000001AF:0x 617070656E64(append)
46. 0x0x000001B0:0x01
0x0000001B1-0x000001B2:0x002D(45)
0x0000001B3- 0x000001DF:0x284C6A6176612F6C616E672F537472696E673B294C6A6176612F6C616E672F537472696E674275696C6465723B((Ljava/lang/String;)Ljava/lang/StringBuilder;)
47. 0x000001E0:0x01
0x000001E1-0x0000001E2:0x0008
0x000001E3-0x0000001EA:0x 746F537472696E67(toString)
48. 0x000001EB:0x01
0x000001EC-0x000001ED:0x0014(20)
0x000001EE-0x000000201:0x28294C6A6176612F6C616E672F537472696E673B(()Ljava/lang/String;)
49. 0x00000202:0x01
0x00000203-0x00000204:0x0013(19)
0x00000205-0x00000217:0x6A6176612F696F2F5072696E7453747265616D(java/io/PrintStream)
50. 0x00000218:0x01
0x00000219-0x0000021A:0x0007
0x0000021B-0x00000221:0x 7072696E746C6E(println)
access_flags
0x00000222-0x00000223:0x0021 access_flags
Accees_flags後面爲類索引,父類索引,索引接口集合
this_class
0x00000224-0x00000225:0x000A(10) 類索引
通過0x000A找到索引爲0x000A的CONSTANT_Class_info型常量,通過該常量的index(0x0027(39))找到索引爲0x0027的CONSTANT_Utf8_info型常量中的全限定名字符串:TestClass。
super_class
0X00000226-0x00000227:0x000B(11) 父類索引
與類索引一致,全限定名字符串爲:java/lang/Object
interfaces_count
0x00000228-0x00000229:0x0000索引接口集合計數器,如果爲0,後面接口的索引表不再佔用任何字節。TestClass沒有實現任何接口。所以計數器爲0.
Interfaces
沒有實現接口,所以爲空
fields_count
0x0000022A-0x0000022B:0x0003字段計數器(u2類型),TestClass有三個字段。
fields
0. 0x0000022C-0x0000022D:0x0004 字段access_flags protected
0x0000022E-0x0000022F:0x000F(15)name_index 從常量池中查找結果爲num
0x00000230-0x00000231:0x0010(16)descriptor_index 從常量池中查找結果爲I,即爲int型。
0x00000232-0x00000233:0x0000屬性計數器
1. 0x00000234-0x00000235:0x0002access_flags private
0x00000236-0x00000237:0x0011(17)name_index userName
0x00000238-0x00000239:0x0012(18)descriptor_index Ljava/lang/String;
0x0000023A-0x0000023B:0x0000 屬性計數器
2. 0x0000023C-0x0000023D:0x0001access_flags public
0x0000023E-0x0000023F:0x0013(19)name_index ho
0x00000240-0x00000241:0x0012(20)descriptor_index LtestClass$Shello;
0x00000242-0x00000243:0x0000屬性計數器
methods_count
0x00000244-0x00000245:0x0003 方法計數器
methods
0. 0x00000246-0x00000247:0x0001access_flags ACC_PUBLIC
0x00000248-0x00000249:0x0015(21)name_index <init>
0x0000024A-0x0000024B:0x0016(22)descriptor_index ()V
0x0000024C-0x0000024D:0x0001attributes_count
0) 0x0000024E-0x0000024F:0x0017(23)attribute_name_index Code
0x00000250-0x00000253:0x00000021(33) attribute_length
0x00000254-0x00000255:0x0001 max_stack
0x00000256-0x00000257:0x0001 max_locals
0x00000258-0x0000025B:0x000005 code_length
0x0000025C-0x00000260:0x2AB70001B1 code
aload_0
Invokespecial Nop #1(java/lang/Object.<init>()V
return
0x00000261-0x00000262:0x0000 exception_table_length
0x00000263-0x00000264:0x0001attributes_count
0.0) 0x00000265-0x00000266:0x0018(24) attribute_name_index LineNumberTable
0x00000167-0x0000026A:0x0000000A(10)attribute_length
0x0000016B-0x0000026C:0x0002line_number_table_length
Line_number_info:
0.0.0) 0x0000026D-0x0000026E:0x0000start_pc
0x0000026F-0x00000270:0x0x0002line_number
0.0.1) 0x00000271-0x00000272:0x0004 start_pc
0x00000273-0x00000274:0x000F(15) line_number
1. 0x00000275-0x00000276:0x0001access_flags ACC_PUBLIC
0x00000277-0x00000278:0x0019(25)name_index sayHello
0x00000279-0x0000027A:0x001A(26) descriptor_index (Ljava/lang/String;)V
0x0000027B-0x0000027C:0x0001 attributes_count
Attribute_info:
0) 0x0000027D-0x000027E:0x0017(23)attribute_name_index Code
0x0000027F-0x00000282:0x00000036(54) attribute_length
0x00000283-0x00000284:0x0003max_stack
0x00000285-0x00000286:0x0002max_locals
0x00000287-0x0000028A:0x0000001A(26) code_length
0x0000028B-0x000002A3:0xB20002BB000359B700041205B600062BB60006B60007B60008B1 code
B2 00 02:getstatic nop #2(java/lang/System.out:Ljava/io/PrintStream)
BB 00 03:new nop#3(java/lang/StringBuilder)
59:dup
B7 00 04:invokespecial nop #04 (java/lang/StringBuilder.<init>:()V)
12 05:ldc #5 (Say)
B6 00 06:invokevirtual #6(java/lang/StringBuilder.append.(Ljava/lang/String;)Ljava/lang/StringBuilder;
2B:aload_1
B6 00 06:invokevirtual #6 (java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;)
B6 00 07:invokevirtual #7(java/lang/StringBuilder.toString:()Ljava/lang/String;)
B6 00 08:invokevirtual #8(java/io/PrintStream.println(Ljava/lang/String;)V)
B1:return
0x000002A5-0x000002A6:0x0000exception_table_length
0x000002A7-0x000002A8:0x0001attributes_count
Attribute_info:
0) 0x000002A9-0x000002AA:0x0018(24)attribute_name_index LineNumberTable
0x000002AB-0x000002AE:0x0000000A(10)attribute_length
0x000002AF-0x000002B0:0x0002attribute_number_table_length
0.0) 0x000002B1-0x000002B2:0x0000start_pc
0x000002B3-0x000002B4:0x0008 line_number
0.1) 0x000002B5-0x000002B6:0x0019(25) start_pc
0x000002B7-0x00002B8:0x0009line_number
2. 0x000002B9-0x000002BA:0x0009ACC_PUBLIC ACC_STATIC
0x000002BB-0x000002BC:0x001B(27)name_index go
0x000002BD-0x000002BE:0x0016(22)descriptor_index ()V
0x000002BF-0x000002C0:0x0001attributes_count
0) 0x000002C1-0x000002C2:0x0017(23)attribute_name_Index Code
0x000002C3-0x000002C6:0x00000025(37)attribute_length
0x000002C7-0x000002C8:0x0002max_stack
0x000002C9-0x000002CA:0x0000max_locals
0x000002CB-0x000002CE:0x00000009code_length
0x000002CF-0x000002D7:0xB200021209B60008B1code
B2 00 02:getstaticnop #2 ( java/lang/System.out: Ljava/io/PrintStream;)
12 09:ldc #9 (go)
B6 00 08:incokevirtual #8 (java/io/PrintStream.println:(Ljava/lang/String;)V)
B1:return
0x000002D8-0x000002D9:0x0000exception_table_length
0x000002DA-0x000002DB:0x0001attributes_count
Attribute_info:
0) 0x000002 DC-0x000002DD:0x0018(24)attribute_name LineNumberTable
0x000002DE-0x000002E1:0x0000000A(10) attribute_length
0x000002E2-0x000002E3:0x0002line_number_table_length
0.0) 0x000002E4-0x000002E5:0x0000start_pc
0x000002E6-0x000002E7:0x000C(12)line_number
0.1) 0x000002E8-0x000002E9:0x0008start_pc
0x000002EA-0x000002EB:0x000D(13)line_number
attributes_count
0x000002EC-0x00002ED:0x0002attribute_count
attributes
Attribute_info:
0. 0x000002EE-0x000002EF:0x001C(28)attribute_name_index SourceFile
0x000002F0-0x000002F3:0x00000002attribute_length
0x000002F4-0x000002F5:0x001D(29) sourcefile_index TestClass.java
1. 0x000002F6-0x000002F7:0x000E(14)attribute_name_index InnerClasses
0x000002F8-0x000002FB:0x0000000A(10) attribute_length
0x000002FC-0x000002FD:0x001number_of_classes
0) 0x000002FE-0x000002FF:0x000C(12)inner_class_info_index TestClass$SHello
0x00000030-0x00000031:0x000A(10)outer_class_info_index TestClass
0x00000032-0x00000033:0x000D(13)inner_name_index SHello
0x00000034-0x00000035:0x0008inner_class_access_flags ACC_STATIC