一、代码:
package com.example.controller;
public class TestInit {
private static String str="my static String";
static {
System.out.println("in static block......");
}
}
二、字节码: javap -verbose TestInit
Classfile /D:/ch-2/test/target/classes/com/example/controller/TestInit.class
Last modified 2022-6-19; size 591 bytes
MD5 checksum 651e873a849506fc5be499d4e6668124
Compiled from "TestInit.java"
public class com.example.controller.TestInit
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #8.#21 // java/lang/Object."<init>":()V
#2 = String #22 // my static String
#3 = Fieldref #7.#23 // com/example/controller/TestInit.str:Ljava/lang/String;
#4 = Fieldref #24.#25 // java/lang/System.out:Ljava/io/PrintStream;
#5 = String #26 // in static block......
#6 = Methodref #27.#28 // java/io/PrintStream.println:(Ljava/lang/String;)V
#7 = Class #29 // com/example/controller/TestInit
#8 = Class #30 // java/lang/Object
#9 = Utf8 str
#10 = Utf8 Ljava/lang/String;
#11 = Utf8 <init>
#12 = Utf8 ()V
#13 = Utf8 Code
#14 = Utf8 LineNumberTable
#15 = Utf8 LocalVariableTable
#16 = Utf8 this
#17 = Utf8 Lcom/example/controller/TestInit;
#18 = Utf8 <clinit>
#19 = Utf8 SourceFile
#20 = Utf8 TestInit.java
#21 = NameAndType #11:#12 // "<init>":()V
#22 = Utf8 my static String
#23 = NameAndType #9:#10 // str:Ljava/lang/String;
#24 = Class #31 // java/lang/System
#25 = NameAndType #32:#33 // out:Ljava/io/PrintStream;
#26 = Utf8 in static block......
#27 = Class #34 // java/io/PrintStream
#28 = NameAndType #35:#36 // println:(Ljava/lang/String;)V
#29 = Utf8 com/example/controller/TestInit
#30 = Utf8 java/lang/Object
#31 = Utf8 java/lang/System
#32 = Utf8 out
#33 = Utf8 Ljava/io/PrintStream;
#34 = Utf8 java/io/PrintStream
#35 = Utf8 println
#36 = Utf8 (Ljava/lang/String;)V
{
public com.example.controller.TestInit();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/example/controller/TestInit;
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: ldc #2 // String my static String
2: putstatic #3 // Field str:Ljava/lang/String;
5: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
8: ldc #5 // String in static block......
10: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
13: return
LineNumberTable:
line 5: 0
line 7: 5
line 9: 13
}
SourceFile: "TestInit.java"
三、可以看到clinit这个方法的指令:
0: ldc #2 // String my static String
2: putstatic #3 // Field str:Ljava/lang/String;
5: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
8: ldc #5 // String in static block......
10: invokevirtual #6 // Method java/io/PrintStream.println: