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 文件内容项
magic(魔数) : class文件前四位字节,class文件总是以 0xCAFEBABE 开头,作为class文件标识。
minor_version / major_version 主次版本号,JVM 根据版本号决定如何加载class文件
constant_pool_count / constant_pool :常量池
每一个常量池入口都是从一个标识(长度是一个字节)开始。次标识指明该位置常量的类型。
每一个标志都有一个相对的表,表名就是标志名加上“_info” 即 constant_utf8_info
access_flage : 访问标志,指明class文件定义的是类还是接口,以及类或接口的修饰符。
this_class :就是指向常量池中constant_class_info的索引。
super_class :也是一个指向常量池的索引。
interfaces / fields / methods /attribute :也是指向常量池的索引。
XXX_count :就是对应的数量。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx