java class文件內容分析

分析了一下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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章