什么是引导方法参数 - 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 u0001u0001
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 表达式的相关性。

引导方法用于解析invokedynamic指令。

invokedynamic是一种通用机制,不仅适用于 lambda,因此引导方法绝对有可能具有任意数量的参数,其含义取决于所调用的方法(请参阅上面的链接(。

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

相关内容

  • 没有找到相关文章

最新更新