什么是引导方法参数 - Java字节码

时间:2018-06-13 07:42:54

标签: java lambda jvm bytecode jvm-bytecode

带有3个方法参数的Bootstrap方法:

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;

带有单个参数的Bootstrap方法:

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字节码并想知道:

  • 什么是bootstrap方法参数?
  • 第一个实例的第二个参数似乎引用了 lamda表达。那是什么?

注意: 这不是关于如何确定对象是lambda。我只想通过检查字节码来了解什么是bootstrap方法参数及其与lambda表达式的相关性,

1 个答案:

答案 0 :(得分:2)

Bootstrap methods用于resolve invokedynamic指令。

invokedynamic是一个通用机制,不仅适用于lambdas,因此bootstrap方法绝对有可能拥有任意数量的参数,这意味着取决于被调用的方法(参见上面的链接)

invokedynamic也用于编译lambda表达式。在这种情况下,指令通常将LambdaMetafactory.metafactoryLambdaMetafactory.altMetafactory称为引导方法。这些引导方法的参数在Javadoc中描述。