Вопрос: Что означает строка 14?
Используйте javap -v -c для дизассемблирования следующего кода:
public class test {
static int i = 2;
public static void main(String[] args) {
test x = new test();
System.out.println("text + String: " + i);
}
}
в основной функции получаем следующее:
14: invokedynamic #20, 0 // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
19: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
...
BootstrapMethods:
0: #38 REF_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;
Method arguments:
#44 text + String: \u0001
Так, например, строка 19 означает, что вызывается виртуальная функция из элемента #24 в пуле констант времени выполнения. Вызванный метод — println()
из класса java/io/PrintStream
, его ввод — из класса Ljava/lang/String
, возвращаемое значение — Void.
Что касается строки 14, #0 содержит ссылку на BootstrapMethod и возвращает объект, класс которого равен CallSite
, верно? Затем:
- на что указывает №20?
- Что означает комментарий
#0:makeConcatWithConstants:(I)Ljava/lang/String;
?
Кроме того, где я могу узнать больше о грамматике кода дизассемблирования Javap? или какое правильное ключевое слово? Документ Oracle о the JVM instruction set
, похоже, не дает четкого описания смысла комментария.