это постоянный индекс пула, постоянный пул хранит всю информацию о файле класса, индекс использования инструкций JVM ссылается на информацию о классе, такую как поля, методы.
Я буду использовать пример Hello World, чтобы показать, как это работает:
источник
System.out.println("hello world");
байткод
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String hello world
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
инструкция байт-кода отформатирована как instruction constant pool index
Constant pool:
#4 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V
#28 = Class #36 // java/io/PrintStream
#29 = NameAndType #37:#38 // println:(Ljava/lang/String;)V
#36 = Utf8 java/io/PrintStream
#37 = Utf8 println
#38 = Utf8 (Ljava/lang/String;)V
поэтому эта инструкция будет вызывать метод с индексом 4
invokevirtual #4
и индекс 4 представляет собой Methodref
из // java/io/PrintStream.println:(Ljava/lang/String;)V
если мы пойдем по ссылке в пуле констант, мы обнаружим, что вся информация хранится в строке и компоновывается в сложный тип, такой как метод, поле, класс.