lambda什么是引导方法参数Java字节码
具有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字节码,想知道:
- 什么是引导方法参数李>
- 第一审的第二个论点似乎提到了 拉姆达表情。那是什么李>
注意: 这与如何确定对象是lambda无关。我只想通过检查字节码来理解什么是引导方法参数,以及它与lambda表达式的相关性
# 1 楼答案
Bootstrap methods用于resolve^{} 指令
invokedynamic
是一种通用机制,不仅适用于lambda,因此bootstrap方法完全有可能具有任意数量的参数,其含义取决于所调用的方法(请参见上面的链接)invokedynamic
也用于编译lambda表达式。在这种情况下,指令通常将LambdaMetafactory.metafactory或LambdaMetafactory.altMetafactory称为引导方法。这些引导方法的参数在Javadoc中描述