Java bytecode, java Supplier and invokedynamic argument -


i have class, , compile it.

package org.test;  import java.util.function.supplier;  public class test {     static string get() { return "!!"; }      public static void main(string[] args) {         supplier<string> sup = test::get;         system.out.println(sup.get());     } } 

then, trying it's bytecode, following beginning of public static void main function:

  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 #3,  0              // invokedynamic #0:get:()ljava/util/function/supplier;          5: astore_1          6: getstatic     #4                  // field java/lang/system.out:ljava/io/printstream; 

here can see invokedynamic call, which, if understand correctly, creates anonymous instance of supplier interface. passed invokedynamic 2 arguments, 1 #3. second argument 0. so, first question is: 0 stand here for?

in constant pool #3 stands #3 = invokedynamic #0:#27 // #0:get:()ljava/util/function/supplier;. there reference #27 in constant pool, no reference #0. second question is: #0 stand here?

the #0 (which can see in comment next invokedynamic) index in bootstrapmethods table. first question, 0 refers #0. , in turn index of bootstrapmethods table. provides link between invokedynamic call origin , targeted method.

if decompile javap -c -v filenameyou see whole constant pool. (which assuming have done?). here should find reference #x methodhandle #y:#z iddl.bootstrapdynamic. point bootstrapmethods table links to. handle #0 links to, should resolve static bootstrapdynamic() method.


Comments

Popular posts from this blog

magento2 - Magento 2 admin grid add filter to collection -

Android volley - avoid multiple requests of the same kind to the server? -

Combining PHP Registration and Login into one class with multiple functions in one PHP file -