Что такое аргумент метода начальной загрузки - Java Bytecode - PullRequest
0 голосов
/ 13 июня 2018

Метод начальной загрузки с 3 аргументами метода:

SourceFile: "Class.java"
BootstrapMethods:
  0: #883 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #884 ()Ljava/lang/Object;
      #885 REF_invokeVirtual java/lang/Module.getClassLoader:()Ljava/lang/ClassLoader;
      #886 ()Ljava/lang/ClassLoader;

Методы начальной загрузки с одним аргументом:

BootstrapMethods:
  0: #284 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:
      #285 \u0001\u0001
  1: #284 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:
      #290 \u0001 is not a \u0001

Я начал изучать байт-код Java и хочу знать:

  • Что на самом деле является аргументом метода начальной загрузки?
  • Второй аргумент первого экземпляра, кажется, имеет ссылку на выражение лямда.Что это?

Примечание: Это не о том, как определить, что объект является лямбда-выражением.Я просто хочу понять, что такое аргумент метода начальной загрузки и его отношение к лямбда-выражениям , просто проверив байт-код.

1 Ответ

0 голосов
/ 13 июня 2018

Методы начальной загрузки используются для разрешения invokedynamic инструкции.

invokedynamic - это механизм общего назначения, не только длялямбда, поэтому для метода начальной загрузки абсолютно возможно иметь произвольное число аргументов, значение которого зависит от вызываемого метода (см. ссылки выше).

invokedynamic также используется для компиляции лямбда-выражений,В этом случае инструкция обычно ссылается на LambdaMetafactory.metafactory или LambdaMetafactory.altMetafactory в качестве метода начальной загрузки.Аргументы этих методов начальной загрузки описаны в Javadoc .

...