PDF
invokedynamic1JavaInvokeDynamicContentsinvokedynamic .................................................................................... 1invoke-Duck Typinginvokedynamic ............................................................................... 4invokedynamicLabmdaJVM .................................................................................. 6 .................................................................................................... 7String str = "Hello world"CONSTANT_Class CONSTANT_Long CONSTANT_Fieldref CONSTANT_Double CONSTANT_Methodref CONSTANT_NameAndType CONSTANT_InterfaceMethodref CONSTANT_Utf8 CONSTANT_String CONSTANT_MethodHandle CONSTANT_Integer CONSTANT_MethodType CONSTANT_Float CONSTANT_InvokeDynamic CONSTANT_InvokeDynamicinvokedynamicCONSTANT_InvokeDynamicinvokedynamicinvokedynamicJava7invoke-invokeinvokevirtualinvokestaticinvokeinterfaceinvokespecial<init>super.someMethod() invokedynamic2// Foo.javapublic class Foo { public static void main(String[] args) { long now = System.currentTimeMillis(); // ArrayList<String> arrayList = new ArrayList<>(); // List<String> list = arrayList; arrayList.add("hello"); // list.add("world"); // }}javac Foo.java && javap -v Fooinvokepublic static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=5, args_size=1 0: invokestatic #2 // Method java/lang/System.currentTimeMillis:()J 3: lstore_1 4: new #3 // class java/util/ArrayList 7: dup 8: invokespecial #4 // Method java/util/ArrayList."<init>":()V 11: astore_3 12: aload_3 13: astore 4 15: aload_3 16: ldc #5 // String hello 18: invokevirtual #6 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z 21: pop 22: aload 4 24: ldc #7 // String world 26: invokeinterface #8, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z 31: pop 32: returnSystem.currentTimeMillis()invokestaticArrayListinvokespecialnew使invokespecialArrayListaddinvokevirtual invokedynamic3ListaddinvokeinterfaceDuck TypingDuck typing西function calculate(a, b, c) => return (a+b)*cexample1 = calculate (1, 2, 3)example2 = calculate ([1, 2, 3], [4, 5, 6], 2)example3 = calculate ('apples ', 'and oranges, ', 3)使+*invokedyanmicDuck typing西lambdalambdainvokedynamiclambdajavacinvokedynamicinvokedynamiclambdainvokedynamiclambdainvokedynamicimport java.util.function.*;public class Hello { invokedynamic4 public static void main(String[] args) { Supplier<String> welcome = () -> "Hello world!"; System.out.println(welcome.get()); }}Constant pool: #1 = Methodref #9.#20 // java/lang/Object."<init>":()V #2 = InvokeDynamic #0:#26 // #0:get:()Ljava/util/function/Supplier;public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=1 0: invokedynamic #2, 0 // InvokeDynamic #0:get:()Ljava/util/function/Supplier;Supplier.get()maininvokedynamicinvokedynamicinvokedyanmicinvokedynamicCONSTANT_InvokeDynamic_infoBootstrapMethods_attribute(Bootstrap method)AttributesBootstrapMethods_attributeCONSTANT_InvokeDynamicBootstrapMethods_attribute { u2 attribute_name_index; u4 attribute_length; u2 num_bootstrap_methods; { u2 bootstrap_method_ref; u2 num_bootstrap_arguments; u2 bootstrap_arguments[num_bootstrap_arguments]; } bootstrap_methods[num_bootstrap_methods];} invokedynamic5CONSTANT_MethodHandle_infostatic CallSite bootstrapMethod(MethodHandles.Lookup caller, String name, MethodType type);invokedynamic使java.lang.invoke.LambdaMetafactorystatic CallSite altMetafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, Object... args);static CallSite metafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodType samMethodType, MethodHandle implMethod, MethodType instantiatedMethodType);BootstrapMethods: 0: #22 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: #23 ()Ljava/lang/Object; #24 invokestatic Hello.lambda$main$0:()Ljava/lang/String; #25 ()Ljava/lang/String;InvokeDynamicCONSTANT_InvokeDynamic_info { u1 tag; u2 bootstrap_method_attr_index; u2 name_and_type_index;}bootstrap_method_attr_indexname_and_type_indexbootstrap_method_attr_indexinvokedynamicinvokedynamic #2, 0 // InvokeDynamic #0:get:()Ljava/util/function/Supplier;#2InvokeDynamic LabmdaJVM6invokedynamicinvokedynamicinvokedynamic indexbyte1 indexbyte2 0 0(indexbyte1 << 8) | indexbyte2#2LabmdaJVMLambdaMetafactory.metafactoryUNSAFE.ensureClassInitialized(innerClass)java -Djdk.internal.lambda.dumpProxyClasses=/Users/hfli/Downloads/tmp HelloHello$$Lambda$1.classfinal class Hello$$Lambda$1 implements Supplier { private Hello$$Lambda$1() { } @Hidden public Object get() { return Hello.lambda$main$0(); }}SupplierHello.lambda$main$0()Hello.class使javap -pprivate static java.lang.String lambda$main$0(); descriptor: ()Ljava/lang/String; flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC Code: stack=1, locals=0, args_size=0 0: ldc #7 // String Hello world! 7 2: areturn LineNumberTable: line 6: 0metafactory()Hello$$Lambda$1Hello$$Lambda$1.get()Hello.lambda$main$0()使invokedynamic西invokedynamic西#Object obj = ...; // no static type available dynamic duck = obj;duck.quack(); // or any method. no compiler checking.使 8线

HTML view coming soon.

Download PDF for the full formatted version.