我一直在阅读关于java8 lambdas实现的演示文稿http://fr.slideshare.net/czechscala/java-8-under-the-hood
LambdaMetaFactory包含用于将lambda表达式转换为功能接口对象的引导方法.
这些bootstrap methods是什么,它们是否相关invokedynamic?
问题:第14行是什么意思?
使用 javap -v -c 反汇编以下代码:
public class test {
static int i = 2;
public static void main(String[] args) {
test x = new test();
System.out.println("text + String: " + i);
}
}
Run Code Online (Sandbox Code Playgroud)
在主函数中,我们得到以下内容:
14: invokedynamic #20, 0 // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
19: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
...
BootstrapMethods:
0: #38 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:
#44 text + String: \u0001
Run Code Online (Sandbox Code Playgroud)
因此,例如,第 19 行表示来自运行时常量池中 #24 项的 invokevirtual 函数。调用的方法println()来自于类java/io/PrintStream,其输入来自于类Ljava/lang/String,其返回值为 Void。
至于第 14 行,#0 持有对 BootstrapMethod …