类型 | 名称 | 数量 | 描述 |
---|---|---|---|
u4 | magic | 1 | 魔数 |
u2 | minor_version | 1 | 次版本号 |
u2 | major_version | 1 | 主版本号 |
u2 | constant_pool_count | 1 | 常量池容量 |
cp_info | constant_pool | costant_pool_count-1 | 常量池 |
u2 | access_flags | 1 | 访问标志 |
u2 | this_class | 1 | 当前类常量索引 |
u2 | super_class | 1 | 超类常量索引 |
u2 | interfaces_count | 1 | 接口数量 |
u2 | interfaces | interfaces_count | 接口常量索引 |
u2 | fields_count | 1 | 字段数量 |
field_info | fields | fields_count | 字段信息 |
u2 | methods_count | 1 | 方法数量 |
method_info | methods | methods_count | 方法信息 |
u2 | attributes_count | 1 | 属性数量 |
attribute_info | attributes | attributes_count | 属性信息 |
说明:u代表字长,u4代表四个字节,以此类推,
由于不包含任何分隔符,故表中的数据项,无论是数量还是顺序,都是被严格限定的。哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变
- 文件示例:
- 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
- 字节码(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文件结构详解
-
magic:魔数,16进制打开class文件,头四个字节为,0xCAFEBABE(cafe babe),它的唯一作用是用来确定该文件是否为一个能被虚拟机接受的Class文件。使用魔数而不使用文件扩展名是出于安全方面的考虑,因为文件扩展名可以很随意的被改动.
-
minor_version:占2字节,次版本号,0x0000,
-
majro_version:占2字节,主版本号,0x0034,转化为十进制为52,是使用JDK1.8编译的(JDK1.5:0x0031,JDK1.6:0x0032,JDK1.7:0x0033,JDK1.8:0x0034)
高版本的JDK可以向下兼容以前版本的Class文件,但是无法运行高版本的Class文件,即使文件格式并未发生变化,比如使用JDK1.7运行使用JDK1.8编译的Class文件就不行 -
由于常量池中常量的数目不是固定的,所以在常量池入口首先使用一个2字节长的无符号数constatn_pool_count来代表常量池计数值,constant_pool_count:占2字节,0x005a,转化为十进制为90,即说明常量池中有89个常量(只有常量池的计数是从1开始的,其它集合类型均从0开始),索引值为1~89。第0项常量具有特殊意义,如果某些指向常量池索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义,这种情况可以将索引值置为0来表示
-
constant_pool:表类型数据集合,即常量池中每一项常量都是一个表,共有11种结构各不相同的表结构数据。这11种表都有一个共同的特点,即均由一个u1类型的标志位开始,可以通过这个标志位来判断这个常量属于哪种常量类型,常量类型及其数据结构如下表所示:
-
constant_pool
-
首先来看常量池中的第一项常量,其标志位为0x09,是一个CONSTANT_Fieldref_info类型常量,此类型常量代表一个字段的符号引用。根据其数据结构,接下来2位字节用来保存一个索引值,它指向常量池中一个CONSTANT_Class_info类型的常量,此常量代表了声明这个字段的类或接口的全限定名,索引值为0x000a,即指向了常量池中的第10项常量,接下来的两个字节[0x0047]指向字段的描述符,指向常量池中的71项常量,通过查看字节码:
#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类型常量来描述名称,而该常量的长度由2个字节表示,所以类的全限定名、字段名、方法名的最大长度不能超过2个字节所能表示的最大整数,也就是65535
-
![](https://img.haomeiwen.com/i5143802/305451a27111c8e7.png)
-
分析二进制文件有点累,还是分析字节码吧[bytecode]
-
常量池之后接下来2个字节代表访问标志位。这个标志用于识别类或接口层次的访问信息,如:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型等,flags: (0x0021) ACC_PUBLIC, ACC_SUPER
access_flag
根据上面的表格,测试类的访问标志为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:类索引,用于确定这个类的全限定名,占2字节
- super_class:父类索引,用于确定这个类父类的全限定名(Java语言不允许多重继承,故父类索引只有一个。除了java.lang.Object类之外所有类都有父类,故除了java.lang.Object类之外,所有类该字段值都不为0),占2字节
- interfaces_count:接口索引计数器,占2字节。如果该类没有实现任何接口,则该计数器值为0,并且后面的接口的索引集合将不占用任何字节,
- interfaces:接口索引集合,一组u2类型数据的集合。用来描述这个类实现了哪些接口,这些被实现的接口将按implements语句(如果该类本身为接口,则为extends语句)后的接口顺序从左至右排列在接口的索引集合中
- methods、fields
类中的方法和成员变量 - attributes
这里的 attributes 是 JVM 里的属性,Java虚拟机预定了几个属性,如下表
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 |
- 方法区:
- descriptor:类型描述符
- flags: (0x0001) ACC_PUBLIC,访问权限
- Code:Java代码编译成的字节码指令
- LineNumberTable:用于描述Java源码的行号与字节码行号之间的对应关系,非运行时必需属性,会默认生成至Class文件中,可以使用Javac的-g:none或-g:lines关闭或要求生成该项属性信息,不生成该属性的最大影响是:
- 抛出异常时,堆栈将不会显示出错的行号;
- 调试程序时无法按照源码设置断点
- LocalVariableTable:用于描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的关系,非运行时必需属性,默认不会生成至Class文件中,可以使用Javac的-g:none或-g:vars关闭或要求生成该项属性信息,
- LocalVariableTypeTable:用于描述栈帧中局部变量表中的变量类型与Java源码中定义的变量类型之间的关系
- Signature:签名信息
- SourceFile属性:用于记录生成这个Class文件的源码文件名称,为可选项,可以使用Javac的-g:none或-g:source关闭或要求生成该项属性信息,
网友评论