java - 什么是引导方法参数 - 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 字节码并想知道:
- 什么是引导方法参数?
- 第一个实例的第二个参数似乎引用了 lamda 表达式。那是什么?
注意: 这不是关于如何确定对象是 lambda。我只想通过检查字节码来了解什么是引导方法参数,以及它与 lambda 表达式的相关性。
解决方案
引导方法用于解析 invokedynamic
指令。
invokedynamic
是一种通用机制,不仅适用于 lambda,因此引导方法绝对有可能具有任意数量的参数,这意味着取决于被调用的方法(参见上面的链接)。
invokedynamic
也用于编译 lambda 表达式。在这种情况下,指令通常将LambdaMetafactory.metafactory或LambdaMetafactory.altMetafactory作为引导方法。Javadoc中描述了这些引导方法的参数。
推荐阅读
- php - 每页的WordPress自定义链接并显示它
- php - 上交时的PERMISSION_DENIED课堂api,即使课程作业也是使用课堂api创建的
- javascript - 从 spring 控制器动态创建 HTML 文本框
- express - 如何使用车把编写带有条件的 {{#each}} 语句,是否可以
- html - 尝试在 Angular 中显示后端发送的 SVG
- asp.net-core - Cookie 不会从前端发送到后端
- java - 使用 Java/Spring 连接到 Azure 事件网格和服务总线
- python - 该程序没有正确比较两个数字
- python - SQLite3 和多线程?最好的行动方案是什么?
- c# - EventCounters 是从 .NET 库中公开指标的标准方法吗?