美文网首页
Java class 文件结构(Version-java8)

Java class 文件结构(Version-java8)

作者: MicoCube | 来源:发表于2019-01-16 14:43 被阅读0次
    类型 名称 数量 描述
    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 
      
      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

    类型描述符
    • 分析二进制文件有点累,还是分析字节码吧[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关闭或要求生成该项属性信息,

    相关文章

      网友评论

          本文标题:Java class 文件结构(Version-java8)

          本文链接:https://www.haomeiwen.com/subject/hjupdqtx.html