類型 | 名稱 | 數(shù)量 | 描述 |
---|---|---|---|
u4 | magic | 1 | 魔數(shù) |
u2 | minor_version | 1 | 次版本號(hào) |
u2 | major_version | 1 | 主版本號(hào) |
u2 | constant_pool_count | 1 | 常量池容量 |
cp_info | constant_pool | costant_pool_count-1 | 常量池 |
u2 | access_flags | 1 | 訪問(wèn)標(biāo)志 |
u2 | this_class | 1 | 當(dāng)前類常量索引 |
u2 | super_class | 1 | 超類常量索引 |
u2 | interfaces_count | 1 | 接口數(shù)量 |
u2 | interfaces | interfaces_count | 接口常量索引 |
u2 | fields_count | 1 | 字段數(shù)量 |
field_info | fields | fields_count | 字段信息 |
u2 | methods_count | 1 | 方法數(shù)量 |
method_info | methods | methods_count | 方法信息 |
u2 | attributes_count | 1 | 屬性數(shù)量 |
attribute_info | attributes | attributes_count | 屬性信息 |
說(shuō)明:u代表字長(zhǎng),u4代表四個(gè)字節(jié),以此類推,
由于不包含任何分隔符,故表中的數(shù)據(jù)項(xiàng),無(wú)論是數(shù)量還是順序,都是被嚴(yán)格限定的。哪個(gè)字節(jié)代表什么含義,長(zhǎng)度是多少,先后順序如何,都不允許改變
- 文件示例:
- Abc.java(編譯生成Abc.class)
package com.coding.asm.test; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class Abc<K, V> extends LinkedHashMap<K, V> implements Iterable<K> { private static int a; private static final double b = 1000.01D; private Map<K, V> c; public int getA() { return this.a; } public void setA(int var1) { this.a = var1; } public Map<K,V> getC() { return this.c; } public void setC(Map<K,V> var1) { this.c = var1; } public Abc() { } public Iterator iterator2(K var1, V var2) { return null; } public Iterator<K> iterator() { return null; } public Integer compareTo(Integer var1) { return var1; } public K getA(V var1) { return null; } public List<File> get() { ArrayList var1 = new ArrayList(); return var1; } public static void main(String[] var0) { System.out.println("Hello Main!"); } public void print() { System.out.println("Hello ASM!"); } }
- TestBean.class(使用winhex或者sublime查看)
cafe babe 0000 0034 005a 0900 0a00 4709 000a 0048 0a00 0b00 4907 004a 0a00 0400 4909 004b 004c 0800 4d0a 004e 004f 0800 5007 0051 0700 5207 0053 0100 0161 0100 0149 0100 0162 0100 0144 0100 0d43 6f6e 7374 616e 7456 616c 7565 0640 8f40 147a e147 ae01 0001 6301 000f 4c6a 6176 612f 7574 696c 2f4d 6170 3b01 0009 5369 676e 6174 7572 6501 0017 4c6a 6176 612f 7574 696c 2f4d 6170 3c54 4b3b 5456 3b3e 3b01 0004 6765 7441 0100 0328 2949 0100 0443 6f64 6501 000f 4c69 6e65 4e75 6d62 6572 5461 626c 6501 0012 4c6f 6361 6c56 6172 6961 626c 6554 6162 6c65 0100 0474 6869 7301 0019 4c63 6f6d 2f63 6f64 696e 672f 6173 6d2f 7465 7374 2f41 6263 3b01 0016 4c6f 6361 6c56 6172 6961 626c 6554 7970 6554 6162 6c65 0100 214c 636f 6d2f 636f 6469 6e67 2f61 736d 2f74 6573 742f 4162 633c 544b 3b54 563b 3e3b 0100 0473 6574 4101 0004 2849 2956 0100 0476 6172 3101 0004 6765 7443 0100 1128 294c 6a61 7661 2f75 7469 6c2f 4d61 703b 0100 1928 294c 6a61 7661 2f75 7469 6c2f 4d61 703c 544b 3b54 563b 3e3b 0100 0473 6574 4301 0012 284c 6a61 7661 2f75 7469 6c2f 4d61 703b 2956 0100 1a28 4c6a 6176 612f 7574 696c 2f4d 6170 3c54 4b3b 5456 3b3e 3b29 5601 0006 3c69 6e69 743e 0100 0328 2956 0100 0969 7465 7261 746f 7232 0100 3a28 4c6a 6176 612f 6c61 6e67 2f4f 626a 6563 743b 4c6a 6176 612f 6c61 6e67 2f4f 626a 6563 743b 294c 6a61 7661 2f75 7469 6c2f 4974 6572 6174 6f72 3b01 0012 4c6a 6176 612f 6c61 6e67 2f4f 626a 6563 743b 0100 0476 6172 3201 0003 544b 3b01 0003 5456 3b01 001c 2854 4b3b 5456 3b29 4c6a 6176 612f 7574 696c 2f49 7465 7261 746f 723b 0100 0869 7465 7261 746f 7201 0016 2829 4c6a 6176 612f 7574 696c 2f49 7465 7261 746f 723b 0100 1b28 294c 6a61 7661 2f75 7469 6c2f 4974 6572 6174 6f72 3c54 4b3b 3e3b 0100 0963 6f6d 7061 7265 546f 0100 2828 4c6a 6176 612f 6c61 6e67 2f49 6e74 6567 6572 3b29 4c6a 6176 612f 6c61 6e67 2f49 6e74 6567 6572 3b01 0013 4c6a 6176 612f 6c61 6e67 2f49 6e74 6567 6572 3b01 0026 284c 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 3b29 4c6a 6176 612f 6c61 6e67 2f4f 626a 6563 743b 0100 0828 5456 3b29 544b 3b01 0003 6765 7401 0012 2829 4c6a 6176 612f 7574 696c 2f4c 6973 743b 0100 154c 6a61 7661 2f75 7469 6c2f 4172 7261 794c 6973 743b 0100 2228 294c 6a61 7661 2f75 7469 6c2f 4c69 7374 3c4c 6a61 7661 2f69 6f2f 4669 6c65 3b3e 3b01 0004 6d61 696e 0100 1628 5b4c 6a61 7661 2f6c 616e 672f 5374 7269 6e67 3b29 5601 0004 7661 7230 0100 135b 4c6a 6176 612f 6c61 6e67 2f53 7472 696e 673b 0100 0570 7269 6e74 0100 643c 4b3a 4c6a 6176 612f 6c61 6e67 2f4f 626a 6563 743b 563a 4c6a 6176 612f 6c61 6e67 2f4f 626a 6563 743b 3e4c 6a61 7661 2f75 7469 6c2f 4c69 6e6b 6564 4861 7368 4d61 703c 544b 3b54 563b 3e3b 4c6a 6176 612f 6c61 6e67 2f49 7465 7261 626c 653c 544b 3b3e 3b01 000a 536f 7572 6365 4669 6c65 0100 0841 6263 2e6a 6176 610c 000d 000e 0c00 1400 150c 002a 002b 0100 136a 6176 612f 7574 696c 2f41 7272 6179 4c69 7374 0700 540c 0055 0056 0100 0b48 656c 6c6f 204d 6169 6e21 0700 570c 0058 0059 0100 0a48 656c 6c6f 2041 534d 2101 0017 636f 6d2f 636f 6469 6e67 2f61 736d 2f74 6573 742f 4162 6301 0017 6a61 7661 2f75 7469 6c2f 4c69 6e6b 6564 4861 7368 4d61 7001 0012 6a61 7661 2f6c 616e 672f 4974 6572 6162 6c65 0100 106a 6176 612f 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 7401 0015 4c6a 6176 612f 696f 2f50 7269 6e74 5374 7265 616d 3b01 0013 6a61 7661 2f69 6f2f 5072 696e 7453 7472 6561 6d01 0007 7072 696e 746c 6e01 0015 284c 6a61 7661 2f6c 616e 672f 5374 7269 6e67 3b29 5600 2100 0a00 0b00 0100 0c00 0300 0a00 0d00 0e00 0000 1a00 0f00 1000 0100 1100 0000 0200 1200 0200 1400 1500 0100 1600 0000 0200 1700 0c00 0100 1800 1900 0100 1a00 0000 4200 0100 0100 0000 062a 57b2 0001 ac00 0000 0300 1b00 0000 0600 0100 0000 0f00 1c00 0000 0c00 0100 0000 0600 1d00 1e00 0000 1f00 0000 0c00 0100 0000 0600 1d00 2000 0000 0100 2100 2200 0100 1a00 0000 5100 0100 0200 0000 072a 571b b300 01b1 0000 0003 001b 0000 000a 0002 0000 0013 0006 0014 001c 0000 0016 0002 0000 0007 001d 001e 0000 0000 0007 0023 000e 0001 001f 0000 000c 0001 0000 0007 001d 0020 0000 0001 0024 0025 0002 001a 0000 0041 0001 0001 0000 0005 2ab4 0002 b000 0000 0300 1b00 0000 0600 0100 0000 1700 1c00 0000 0c00 0100 0000 0500 1d00 1e00 0000 1f00 0000 0c00 0100 0000 0500 1d00 2000 0000 1600 0000 0200 2600 0100 2700 2800 0200 1a00 0000 5a00 0200 0200 0000 062a 2bb5 0002 b100 0000 0300 1b00 0000 0a00 0200 0000 1b00 0500 1c00 1c00 0000 1600 0200 0000 0600 1d00 1e00 0000 0000 0600 2300 1500 0100 1f00 0000 1600 0200 0000 0600 1d00 2000 0000 0000 0600 2300 1700 0100 1600 0000 0200 2900 0100 2a00 2b00 0100 1a00 0000 4500 0100 0100 0000 052a b700 03b1 0000 0003 001b 0000 000a 0002 0000 001e 0004 001f 001c 0000 000c 0001 0000 0005 001d 001e 0000 001f 0000 000c 0001 0000 0005 001d 0020 0000 0001 002c 002d 0002 001a 0000 0066 0001 0003 0000 0002 01b0 0000 0003 001b 0000 0006 0001 0000 0022 001c 0000 0020 0003 0000 0002 001d 001e 0000 0000 0002 0023 002e 0001 0000 0002 002f 002e 0002 001f 0000 0020 0003 0000 0002 001d 0020 0000 0000 0002 0023 0030 0001 0000 0002 002f 0031 0002 0016 0000 0002 0032 0001 0033 0034 0002 001a 0000 003e 0001 0001 0000 0002 01b0 0000 0003 001b 0000 0006 0001 0000 0026 001c 0000 000c 0001 0000 0002 001d 001e 0000 001f 0000 000c 0001 0000 0002 001d 0020 0000 0016 0000 0002 0035 0001 0036 0037 0001 001a 0000 0048 0001 0002 0000 0002 2bb0 0000 0003 001b 0000 0006 0001 0000 002a 001c 0000 0016 0002 0000 0002 001d 001e 0000 0000 0002 0023 0038 0001 001f 0000 000c 0001 0000 0002 001d 0020 0000 0001 0018 0039 0002 001a 0000 0052 0001 0002 0000 0002 01b0 0000 0003 001b 0000 0006 0001 0000 002e 001c 0000 0016 0002 0000 0002 001d 001e 0000 0000 0002 0023 002e 0001 001f 0000 0016 0002 0000 0002 001d 0020 0000 0000 0002 0023 0031 0001 0016 0000 0002 003a 0001 003b 003c 0002 001a 0000 0054 0002 0002 0000 000a bb00 0459 b700 054c 2bb0 0000 0003 001b 0000 000a 0002 0000 0032 0008 0033 001c 0000 0016 0002 0000 000a 001d 001e 0000 0008 0002 0023 003d 0001 001f 0000 000c 0001 0000 000a 001d 0020 0000 0016 0000 0002 003e 0009 003f 0040 0001 001a 0000 0037 0002 0001 0000 0009 b200 0612 07b6 0008 b100 0000 0200 1b00 0000 0a00 0200 0000 3700 0800 3800 1c00 0000 0c00 0100 0000 0900 4100 4200 0000 0100 4300 2b00 0100 1a00 0000 4900 0200 0100 0000 09b2 0006 1209 b600 08b1 0000 0003 001b 0000 000a 0002 0000 003b 0008 003c 001c 0000 000c 0001 0000 0009 001d 001e 0000 001f 0000 000c 0001 0000 0009 001d 0020 0000 0002 0016 0000 0002 0044 0045 0000 0002 0046
- 字節(jié)碼(javap -c -v ./Abc.class Java javap命令(Version-java9)):
Classfile /Users/micocube/Documents/Utils4j/target/classes/com/coding/asm/test/Abc.class Last modified Jan 15, 2019; size 2532 bytes MD5 checksum 99abe1aa8dc262de3a2717383298195c Compiled from "Abc.java" public class com.coding.asm.test.Abc<K extends java.lang.Object, V extends java.lang.Object> extends java.util.LinkedHashMap<K, V> implements java.lang.Iterable<K> minor version: 0 major version: 52 flags: (0x0021) ACC_PUBLIC, ACC_SUPER this_class: #10 // com/coding/asm/test/Abc super_class: #11 // java/util/LinkedHashMap interfaces: 1, fields: 3, methods: 12, attributes: 2 Constant pool: #1 = Fieldref #10.#71 // com/coding/asm/test/Abc.a:I #2 = Fieldref #10.#72 // com/coding/asm/test/Abc.c:Ljava/util/Map; #3 = Methodref #11.#73 // java/util/LinkedHashMap."<init>":()V #4 = Class #74 // java/util/ArrayList #5 = Methodref #4.#73 // java/util/ArrayList."<init>":()V #6 = Fieldref #75.#76 // java/lang/System.out:Ljava/io/PrintStream; #7 = String #77 // Hello Main! #8 = Methodref #78.#79 // java/io/PrintStream.println:(Ljava/lang/String;)V #9 = String #80 // Hello ASM! #10 = Class #81 // com/coding/asm/test/Abc #11 = Class #82 // java/util/LinkedHashMap #12 = Class #83 // java/lang/Iterable #13 = Utf8 a #14 = Utf8 I #15 = Utf8 b #16 = Utf8 D #17 = Utf8 ConstantValue #18 = Double 1000.01d #20 = Utf8 c #21 = Utf8 Ljava/util/Map; #22 = Utf8 Signature #23 = Utf8 Ljava/util/Map<TK;TV;>; #24 = Utf8 getA #25 = Utf8 ()I #26 = Utf8 Code #27 = Utf8 LineNumberTable #28 = Utf8 LocalVariableTable #29 = Utf8 this #30 = Utf8 Lcom/coding/asm/test/Abc; #31 = Utf8 LocalVariableTypeTable #32 = Utf8 Lcom/coding/asm/test/Abc<TK;TV;>; #33 = Utf8 setA #34 = Utf8 (I)V #35 = Utf8 var1 #36 = Utf8 getC #37 = Utf8 ()Ljava/util/Map; #38 = Utf8 ()Ljava/util/Map<TK;TV;>; #39 = Utf8 setC #40 = Utf8 (Ljava/util/Map;)V #41 = Utf8 (Ljava/util/Map<TK;TV;>;)V #42 = Utf8 <init> #43 = Utf8 ()V #44 = Utf8 iterator2 #45 = Utf8 (Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Iterator; #46 = Utf8 Ljava/lang/Object; #47 = Utf8 var2 #48 = Utf8 TK; #49 = Utf8 TV; #50 = Utf8 (TK;TV;)Ljava/util/Iterator; #51 = Utf8 iterator #52 = Utf8 ()Ljava/util/Iterator; #53 = Utf8 ()Ljava/util/Iterator<TK;>; #54 = Utf8 compareTo #55 = Utf8 (Ljava/lang/Integer;)Ljava/lang/Integer; #56 = Utf8 Ljava/lang/Integer; #57 = Utf8 (Ljava/lang/Object;)Ljava/lang/Object; #58 = Utf8 (TV;)TK; #59 = Utf8 get #60 = Utf8 ()Ljava/util/List; #61 = Utf8 Ljava/util/ArrayList; #62 = Utf8 ()Ljava/util/List<Ljava/io/File;>; #63 = Utf8 main #64 = Utf8 ([Ljava/lang/String;)V #65 = Utf8 var0 #66 = Utf8 [Ljava/lang/String; #67 = Utf8 print #68 = Utf8 <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/LinkedHashMap<TK;TV;>;Ljava/lang/Iterable<TK;>; #69 = Utf8 SourceFile #70 = Utf8 Abc.java #71 = NameAndType #13:#14 // a:I #72 = NameAndType #20:#21 // c:Ljava/util/Map; #73 = NameAndType #42:#43 // "<init>":()V #74 = Utf8 java/util/ArrayList #75 = Class #84 // java/lang/System #76 = NameAndType #85:#86 // out:Ljava/io/PrintStream; #77 = Utf8 Hello Main! #78 = Class #87 // java/io/PrintStream #79 = NameAndType #88:#89 // println:(Ljava/lang/String;)V #80 = Utf8 Hello ASM! #81 = Utf8 com/coding/asm/test/Abc #82 = Utf8 java/util/LinkedHashMap #83 = Utf8 java/lang/Iterable #84 = Utf8 java/lang/System #85 = Utf8 out #86 = Utf8 Ljava/io/PrintStream; #87 = Utf8 java/io/PrintStream #88 = Utf8 println #89 = Utf8 (Ljava/lang/String;)V { public int getA(); descriptor: ()I flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: pop 2: getstatic #1 // Field a:I 5: ireturn LineNumberTable: line 15: 0 LocalVariableTable: Start Length Slot Name Signature 0 6 0 this Lcom/coding/asm/test/Abc; LocalVariableTypeTable: Start Length Slot Name Signature 0 6 0 this Lcom/coding/asm/test/Abc<TK;TV;>; public void setA(int); descriptor: (I)V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=2, args_size=2 0: aload_0 1: pop 2: iload_1 3: putstatic #1 // Field a:I 6: return LineNumberTable: line 19: 0 line 20: 6 LocalVariableTable: Start Length Slot Name Signature 0 7 0 this Lcom/coding/asm/test/Abc; 0 7 1 var1 I LocalVariableTypeTable: Start Length Slot Name Signature 0 7 0 this Lcom/coding/asm/test/Abc<TK;TV;>; public java.util.Map<K, V> getC(); descriptor: ()Ljava/util/Map; flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #2 // Field c:Ljava/util/Map; 4: areturn LineNumberTable: line 23: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/coding/asm/test/Abc; LocalVariableTypeTable: Start Length Slot Name Signature 0 5 0 this Lcom/coding/asm/test/Abc<TK;TV;>; Signature: #38 // ()Ljava/util/Map<TK;TV;>; public void setC(java.util.Map<K, V>); descriptor: (Ljava/util/Map;)V flags: (0x0001) ACC_PUBLIC Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: putfield #2 // Field c:Ljava/util/Map; 5: return LineNumberTable: line 27: 0 line 28: 5 LocalVariableTable: Start Length Slot Name Signature 0 6 0 this Lcom/coding/asm/test/Abc; 0 6 1 var1 Ljava/util/Map; LocalVariableTypeTable: Start Length Slot Name Signature 0 6 0 this Lcom/coding/asm/test/Abc<TK;TV;>; 0 6 1 var1 Ljava/util/Map<TK;TV;>; Signature: #41 // (Ljava/util/Map<TK;TV;>;)V public com.coding.asm.test.Abc(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #3 // Method java/util/LinkedHashMap."<init>":()V 4: return LineNumberTable: line 30: 0 line 31: 4 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/coding/asm/test/Abc; LocalVariableTypeTable: Start Length Slot Name Signature 0 5 0 this Lcom/coding/asm/test/Abc<TK;TV;>; public java.util.Iterator iterator2(K, V); descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Iterator; flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=3, args_size=3 0: aconst_null 1: areturn LineNumberTable: line 34: 0 LocalVariableTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc; 0 2 1 var1 Ljava/lang/Object; 0 2 2 var2 Ljava/lang/Object; LocalVariableTypeTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc<TK;TV;>; 0 2 1 var1 TK; 0 2 2 var2 TV; Signature: #50 // (TK;TV;)Ljava/util/Iterator; public java.util.Iterator<K> iterator(); descriptor: ()Ljava/util/Iterator; flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aconst_null 1: areturn LineNumberTable: line 38: 0 LocalVariableTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc; LocalVariableTypeTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc<TK;TV;>; Signature: #53 // ()Ljava/util/Iterator<TK;>; public java.lang.Integer compareTo(java.lang.Integer); descriptor: (Ljava/lang/Integer;)Ljava/lang/Integer; flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=2, args_size=2 0: aload_1 1: areturn LineNumberTable: line 42: 0 LocalVariableTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc; 0 2 1 var1 Ljava/lang/Integer; LocalVariableTypeTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc<TK;TV;>; public K getA(V); descriptor: (Ljava/lang/Object;)Ljava/lang/Object; flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=2, args_size=2 0: aconst_null 1: areturn LineNumberTable: line 46: 0 LocalVariableTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc; 0 2 1 var1 Ljava/lang/Object; LocalVariableTypeTable: Start Length Slot Name Signature 0 2 0 this Lcom/coding/asm/test/Abc<TK;TV;>; 0 2 1 var1 TV; Signature: #58 // (TV;)TK; public java.util.List<java.io.File> get(); descriptor: ()Ljava/util/List; flags: (0x0001) ACC_PUBLIC Code: stack=2, locals=2, args_size=1 0: new #4 // class java/util/ArrayList 3: dup 4: invokespecial #5 // Method java/util/ArrayList."<init>":()V 7: astore_1 8: aload_1 9: areturn LineNumberTable: line 50: 0 line 51: 8 LocalVariableTable: Start Length Slot Name Signature 0 10 0 this Lcom/coding/asm/test/Abc; 8 2 1 var1 Ljava/util/ArrayList; LocalVariableTypeTable: Start Length Slot Name Signature 0 10 0 this Lcom/coding/asm/test/Abc<TK;TV;>; Signature: #62 // ()Ljava/util/List<Ljava/io/File;>; public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #7 // String Hello Main! 5: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 55: 0 line 56: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 var0 [Ljava/lang/String; public void print(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #9 // String Hello ASM! 5: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 59: 0 line 60: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 this Lcom/coding/asm/test/Abc; LocalVariableTypeTable: Start Length Slot Name Signature 0 9 0 this Lcom/coding/asm/test/Abc<TK;TV;>; } Signature: #68 // <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/LinkedHashMap<TK;TV;>;Ljava/lang/Iterable<TK;>; SourceFile: "Abc.java"
- class文件結(jié)構(gòu)詳解
magic:魔數(shù),16進(jìn)制打開(kāi)class文件,頭四個(gè)字節(jié)為,0xCAFEBABE(cafe babe),它的唯一作用是用來(lái)確定該文件是否為一個(gè)能被虛擬機(jī)接受的Class文件。使用魔數(shù)而不使用文件擴(kuò)展名是出于安全方面的考慮,因?yàn)槲募U(kuò)展名可以很隨意的被改動(dòng).
minor_version:占2字節(jié),次版本號(hào),0x0000,
majro_version:占2字節(jié),主版本號(hào),0x0034,轉(zhuǎn)化為十進(jìn)制為52,是使用JDK1.8編譯的(JDK1.5:0x0031,JDK1.6:0x0032,JDK1.7:0x0033,JDK1.8:0x0034)
高版本的JDK可以向下兼容以前版本的Class文件,但是無(wú)法運(yùn)行高版本的Class文件,即使文件格式并未發(fā)生變化,比如使用JDK1.7運(yùn)行使用JDK1.8編譯的Class文件就不行由于常量池中常量的數(shù)目不是固定的,所以在常量池入口首先使用一個(gè)2字節(jié)長(zhǎng)的無(wú)符號(hào)數(shù)constatn_pool_count來(lái)代表常量池計(jì)數(shù)值,constant_pool_count:占2字節(jié),0x005a,轉(zhuǎn)化為十進(jìn)制為90,即說(shuō)明常量池中有89個(gè)常量(只有常量池的計(jì)數(shù)是從1開(kāi)始的,其它集合類型均從0開(kāi)始),索引值為1~89。第0項(xiàng)常量具有特殊意義,如果某些指向常量池索引值的數(shù)據(jù)在特定情況下需要表達(dá)“不引用任何一個(gè)常量池項(xiàng)目”的含義,這種情況可以將索引值置為0來(lái)表示
constant_pool:表類型數(shù)據(jù)集合,即常量池中每一項(xiàng)常量都是一個(gè)表,共有11種結(jié)構(gòu)各不相同的表結(jié)構(gòu)數(shù)據(jù)。這11種表都有一個(gè)共同的特點(diǎn),即均由一個(gè)u1類型的標(biāo)志位開(kāi)始,可以通過(guò)這個(gè)標(biāo)志位來(lái)判斷這個(gè)常量屬于哪種常量類型,常量類型及其數(shù)據(jù)結(jié)構(gòu)如下表所示:
-
constant_pool
首先來(lái)看常量池中的第一項(xiàng)常量,其標(biāo)志位為0x09,是一個(gè)CONSTANT_Fieldref_info類型常量,此類型常量代表一個(gè)字段的符號(hào)引用。根據(jù)其數(shù)據(jù)結(jié)構(gòu),接下來(lái)2位字節(jié)用來(lái)保存一個(gè)索引值,它指向常量池中一個(gè)CONSTANT_Class_info類型的常量,此常量代表了聲明這個(gè)字段的類或接口的全限定名,索引值為0x000a,即指向了常量池中的第10項(xiàng)常量,接下來(lái)的兩個(gè)字節(jié)[0x0047]指向字段的描述符,指向常量池中的71項(xiàng)常量,通過(guò)查看字節(jié)碼:
#1 = Fieldref #10.#71 // com/coding/asm/test/Abc.a:I
#10 = Class #81 // com/coding/asm/test/Abc
#71 = NameAndType #13:#14 // a:I
可知該字段在com.coding.asm.test.Abc類中聲明(#10
),字段類型為整型(#71
),注意:由于Class文件中,類的全限定名、字段、方法都是使用CONSTANT_Utf8_info類型常量來(lái)描述名稱,而該常量的長(zhǎng)度由2個(gè)字節(jié)表示,所以類的全限定名、字段名、方法名的最大長(zhǎng)度不能超過(guò)2個(gè)字節(jié)所能表示的最大整數(shù),也就是65535
分析二進(jìn)制文件有點(diǎn)累,還是分析字節(jié)碼吧[bytecode]
-
常量池之后接下來(lái)2個(gè)字節(jié)代表訪問(wèn)標(biāo)志位。這個(gè)標(biāo)志用于識(shí)別類或接口層次的訪問(wèn)信息,如:這個(gè)Class是類還是接口,是否定義為public類型,是否定義為abstract類型等,flags: (0x0021) ACC_PUBLIC, ACC_SUPER
access_flag
根據(jù)上面的表格,測(cè)試類的訪問(wèn)標(biāo)志為ACC_PUBLIC | ACC_SUPER = 0x0001 | 0x0020 =1 | 32 = [00000000][00000001] | [00000000][00010000] = [00000000][00010001] = 33 = 0x0021
-
類、父類,字段,屬性與接口集合(this_class 、 super_class 、 interfaces_count 和 interfaces)
- this_class:類索引,用于確定這個(gè)類的全限定名,占2字節(jié)
- super_class:父類索引,用于確定這個(gè)類父類的全限定名(Java語(yǔ)言不允許多重繼承,故父類索引只有一個(gè)。除了java.lang.Object類之外所有類都有父類,故除了java.lang.Object類之外,所有類該字段值都不為0),占2字節(jié)
- interfaces_count:接口索引計(jì)數(shù)器,占2字節(jié)。如果該類沒(méi)有實(shí)現(xiàn)任何接口,則該計(jì)數(shù)器值為0,并且后面的接口的索引集合將不占用任何字節(jié),
- interfaces:接口索引集合,一組u2類型數(shù)據(jù)的集合。用來(lái)描述這個(gè)類實(shí)現(xiàn)了哪些接口,這些被實(shí)現(xiàn)的接口將按implements語(yǔ)句(如果該類本身為接口,則為extends語(yǔ)句)后的接口順序從左至右排列在接口的索引集合中
- methods、fields
類中的方法和成員變量 - attributes
這里的 attributes 是 JVM 里的屬性,Java虛擬機(jī)預(yù)定了幾個(gè)屬性,如下表
Attribute | Location | class file |
---|---|---|
SourceFile | ClassFile | 45.3 |
InnerClasses | ClassFile | 45.3 |
EnclosingMethod | ClassFile | 49.0 |
SourceDebugExtension | ClassFile | 49.0 |
BootstrapMethods | ClassFile | 51.0 |
ConstantValue | field_info | 45.3 |
Code | method_info | 45.3 |
Exceptions | method_info | 45.3 |
RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations | method_info | 49.0 |
AnnotationDefault | method_info | 49.0 |
MethodParameters | method_info | 52.0 |
Synthetic | ClassFile, field_info, method_info | 45.3 |
Deprecated | ClassFile, field_info, method_info | 45.3 |
Signature | ClassFile, field_info, method_info | 49.0 |
RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations | ClassFile, field_info, method_info | 49.0 |
LineNumberTable | Code | 45.3 |
LocalVariableTable | Code | 45.3 |
LocalVariableTypeTable | Cod | e 49.0 |
StackMapTable | Code | 50.0 |
RuntimeVisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations | ClassFile, field_info, method_info, Code | 52.0 |
- 方法區(qū):
- descriptor:類型描述符
- flags: (0x0001) ACC_PUBLIC,訪問(wèn)權(quán)限
- Code:Java代碼編譯成的字節(jié)碼指令
- LineNumberTable:用于描述Java源碼的行號(hào)與字節(jié)碼行號(hào)之間的對(duì)應(yīng)關(guān)系,非運(yùn)行時(shí)必需屬性,會(huì)默認(rèn)生成至Class文件中,可以使用Javac的-g:none或-g:lines關(guān)閉或要求生成該項(xiàng)屬性信息,不生成該屬性的最大影響是:
- 拋出異常時(shí),堆棧將不會(huì)顯示出錯(cuò)的行號(hào);
- 調(diào)試程序時(shí)無(wú)法按照源碼設(shè)置斷點(diǎn)
- LocalVariableTable:用于描述棧幀中局部變量表中的變量與Java源碼中定義的變量之間的關(guān)系,非運(yùn)行時(shí)必需屬性,默認(rèn)不會(huì)生成至Class文件中,可以使用Javac的-g:none或-g:vars關(guān)閉或要求生成該項(xiàng)屬性信息,
- LocalVariableTypeTable:用于描述棧幀中局部變量表中的變量類型與Java源碼中定義的變量類型之間的關(guān)系
- Signature:簽名信息
- SourceFile屬性:用于記錄生成這個(gè)Class文件的源碼文件名稱,為可選項(xiàng),可以使用Javac的-g:none或-g:source關(guān)閉或要求生成該項(xiàng)屬性信息,