Java class 文件简介(3)

public ClassTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        0: aload_0
        1: invokespecial #5                  // Method java/lang/Object."<init>":()V
        4: return
      LineNumberTable:
        line 22: 0
        line 24: 4

static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
        0: bipush        12
        2: putstatic    #8                  // Field variableInt:I
        5: ldc          #9                  // String 我很好
        7: putstatic    #10                // Field variableString:Ljava/lang/String;
        10: return
      LineNumberTable:
        line 5: 0
        line 6: 5
}
SourceFile: "ClassTest.java"

简单版本:

minor version: 0        //---主版本号
  major version: 52        //---次版本号     
  flags: ACC_PUBLIC, ACC_SUPER    //---类访问标识
 //--- 常量池
Constant pool:
  #1 = Fieldref          #34.#35        // java/lang/System.out:Ljava/io/PrintStream;
  #2 = String            #36            // --这是main()方法---
  .......
  #52 = Utf8              println
  #53 = Utf8              (Ljava/lang/String;)V
{
//--- 字段信息
  static final int constantInt;
    descriptor: I
    flags: ACC_STATIC, ACC_FINAL
    ConstantValue: int 12


  static int variableInt;
    descriptor: I
    flags: ACC_STATIC


//---方法信息
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
        0: getstatic    #1                  // Field java/lang/System.out:Ljava/io/PrintStream;
        3: ldc          #2                  // String --这是main()方法---
        5: invokevirtual #3                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        8: return
      LineNumberTable:
        line 11: 0
        line 13: 8


  public ClassTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        0: aload_0
        1: invokespecial #5                  // Method java/lang/Object."<init>":()V
        4: return
      LineNumberTable:
        line 22: 0
        line 24: 4
       
//-- super()方法
  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
        0: bipush        12
        2: putstatic    #8                  // Field variableInt:I
        5: ldc          #9                  // String 我很好
        7: putstatic    #10                // Field variableString:Ljava/lang/String;
        10: return
      LineNumberTable:
        line 5: 0
        line 6: 5
}

class 文件内容项

Java class 文件简介

magic(魔数) : class文件前四位字节,class文件总是以 0xCAFEBABE 开头,作为class文件标识。

minor_version / major_version  主次版本号,JVM 根据版本号决定如何加载class文件

constant_pool_count / constant_pool :常量池

  每一个常量池入口都是从一个标识(长度是一个字节)开始。次标识指明该位置常量的类型。

  每一个标志都有一个相对的表,表名就是标志名加上“_info”  即 constant_utf8_info

Java class 文件简介

access_flage : 访问标志,指明class文件定义的是类还是接口,以及类或接口的修饰符。

Java class 文件简介

this_class :就是指向常量池中constant_class_info的索引。

super_class :也是一个指向常量池的索引。

interfaces / fields / methods /attribute  :也是指向常量池的索引。

XXX_count :就是对应的数量。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6f593c155d87c27acfed0e4d8d729b27.html