带有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字节码并想知道:
注意: 这不是关于如何确定对象是lambda。我只想通过检查字节码来了解什么是bootstrap方法参数及其与lambda表达式的相关性, 。
答案 0 :(得分:2)
Bootstrap methods用于resolve invokedynamic
指令。
invokedynamic
是一个通用机制,不仅适用于lambdas,因此bootstrap方法绝对有可能拥有任意数量的参数,这意味着取决于被调用的方法(参见上面的链接)
invokedynamic
也用于编译lambda表达式。在这种情况下,指令通常将LambdaMetafactory.metafactory或LambdaMetafactory.altMetafactory称为引导方法。这些引导方法的参数在Javadoc中描述。