什么是 bootstrap 方法参数 - Java 字节码
What is a bootstrap method argument - Java Bytecode
Bootstrap 具有 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;
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 方法参数?
- 一审的第二个参数好像参考了
拉姆达表达式。那是什么?
注:
这与如何确定对象是 lambda 无关。我只想了解什么是 bootstrap 方法参数,以及它与 lambda 表达式的相关性,只需检查字节码即可。
Bootstrap methods are used to resolve invokedynamic
指令。
invokedynamic
是一种通用机制,不仅适用于 lambda,因此 bootstrap 方法绝对有可能具有任意数量的参数,其含义取决于被调用的方法(参见上面的链接)。
invokedynamic
也用于编译 lambda 表达式。在这种情况下,指令通常指的是 LambdaMetafactory.metafactory or LambdaMetafactory.altMetafactory as a bootstrap method. The arguments of these bootstrap methods are described in Javadoc.
Bootstrap 具有 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;
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 方法参数?
- 一审的第二个参数好像参考了 拉姆达表达式。那是什么?
注: 这与如何确定对象是 lambda 无关。我只想了解什么是 bootstrap 方法参数,以及它与 lambda 表达式的相关性,只需检查字节码即可。
Bootstrap methods are used to resolve invokedynamic
指令。
invokedynamic
是一种通用机制,不仅适用于 lambda,因此 bootstrap 方法绝对有可能具有任意数量的参数,其含义取决于被调用的方法(参见上面的链接)。
invokedynamic
也用于编译 lambda 表达式。在这种情况下,指令通常指的是 LambdaMetafactory.metafactory or LambdaMetafactory.altMetafactory as a bootstrap method. The arguments of these bootstrap methods are described in Javadoc.