美文网首页
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)

    class 文件结构 说明:u代表字长,u4代表四个字节,以此类推,由于不包含任何分隔符,故表中的数据项,无论是数...

  • 一文看懂字节码

    1 class 文件的内容 1.1 class 文件整体结构 java 文件 Test.java(297 B): ...

  • javaClass类文件结构,类加载过程以及内存分配

    知识要点: Java虚拟机简介 Class类文件结构 Class类文件结构详解 Java虚拟机简介 Java虚拟机...

  • Java ASM与字节码[bytecode](Version:a

    Java javap命令(Version-java9) Java class 文件结构(Version-java8...

  • Java字节码结构解析

    本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解。建议先阅读Java类文件结构解析这篇文...

  • java class文件结构

    (<深入分析Java Web技术内幕>笔记)java语言在宣传时打出的名号就是"一次编译,到处运行", 也就是支持...

  • java Class文件结构

    该文章是再次读《深入理解java虚拟机》6.3章class类文件的结构的学习记录 使用javac -target ...

  • Java Class文件结构

    引言 我们都知道java是跨平台的,原因就在于各个平台的java虚拟机可以载入和执行同一种平台无关的字节码文件,也...

  • Java Class文件结构

    在了解Java class文件结构之前,我们思考一下如下几个问题: Windows、Linux、Mac 三大平台上...

  • Apk瘦身优化

    了解APK结构 classes.dex: 代码文件 传统的Java程序,首先先把Java文件编译成class文件,...

网友评论

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

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