Java class 文件結(jié)構(gòu)(Version-java8)

類型 名稱 數(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 
    
    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)屬性信息,
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,672評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,965評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評(píng)論 6 413
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,019評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,188評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,845評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,252評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,590評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容