Corretto JDK 21, Gradle을 사용함.
바이트코드는 Jetbrain에서 제공하는 Intellij IDE의 show bytecode 기능을 사용하여 출력됨.
package dev.sijunyang;
public class Main {
public static void main(String[] args) {
array();
}
public static void array() {
int[] intArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int intA = intArr[0];
int intB = intArr[9];
System.out.println("intA = " + intA);
System.out.println("intB = " + intB);
}
}ICONST_0은 0-5까지의 정수를 푸시하는 전용 명령어이고, BIPUSH는 -128~127 범위의 정수를 푸시하는 명령어다.
// class version 65.0 (65)
// access flags 0x21
public class dev/sijunyang/Main {
// compiled from: Main.java
// access flags 0x19
public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Ldev/sijunyang/Main; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 5 L0
INVOKESTATIC dev/sijunyang/Main.array ()V
L1
LINENUMBER 6 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
MAXSTACK = 0
MAXLOCALS = 1
// access flags 0x9
public static array()V
L0
LINENUMBER 9 L0
BIPUSH 10
NEWARRAY T_INT
DUP
ICONST_0
ICONST_1
IASTORE
DUP
ICONST_1
ICONST_2
IASTORE
DUP
ICONST_2
ICONST_3
IASTORE
DUP
ICONST_3
ICONST_4
IASTORE
DUP
ICONST_4
ICONST_5
IASTORE
DUP
ICONST_5
BIPUSH 6
IASTORE
DUP
BIPUSH 6
BIPUSH 7
IASTORE
DUP
BIPUSH 7
BIPUSH 8
IASTORE
DUP
BIPUSH 8
BIPUSH 9
IASTORE
DUP
BIPUSH 9
ICONST_0
IASTORE
ASTORE 0
L1
LINENUMBER 11 L1
ALOAD 0
ICONST_0
IALOAD
ISTORE 1
L2
LINENUMBER 12 L2
ALOAD 0
BIPUSH 9
IALOAD
ISTORE 2
L3
LINENUMBER 14 L3
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEDYNAMIC makeConcatWithConstants(I)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"intA = \u0001"
]
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L4
LINENUMBER 15 L4
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 2
INVOKEDYNAMIC makeConcatWithConstants(I)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"intB = \u0001"
]
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L5
LINENUMBER 16 L5
RETURN
L6
LOCALVARIABLE intArr [I L1 L6 0
LOCALVARIABLE intA I L2 L6 1
LOCALVARIABLE intB I L3 L6 2
MAXSTACK = 4
MAXLOCALS = 3
}