public class StrConcat { static String hello = "Hello"; static String world = "World"; public static void main(String args[]) { System.out.println(hello + world); System.out.println(hello + "World"); System.out.println(hello + args.length); } } ********************************************************************** $ java -Djava.lang.invoke.MethodHandle.TRACE_CALLSITE=true -cp . StrConcat > ~/Documents/str-concat.txt linkCallSite StrConcat.main(StrConcat.java:5) java.lang.invoke.StringConcatFactory.makeConcatWithConstants(Lookup,String,MethodType,String,Object[])CallSite/invokeStatic makeConcatWithConstants(String,String)String/BSA1= linkMethod java.lang.invoke.MethodHandle.invokeExact(Lookup,String,MethodType,String,Object[])CallSite/5 linkMethod => java.lang.invoke.Invokers$Holder.invokeExact_MT(Object,Object,Object,Object,Object,Object,Object)Object/invokeStatic + (Lookup,String,MethodType,String,Object[])CallSite linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_L linkCallSite target => (String,String)String : BMH.reinvoke000_LLL_L=Lambda(a0:L/SpeciesData[L => Species_L],a1:L,a2:L)=>{ t3:L=Species_L.argL0(a0:L); t4:L=MethodHandle.invokeBasic(t3:L,a1:L,a2:L);t4:L} & BMH=[ 0: MethodHandle = {(Object,Object)String : DMH.invokeStatic000_LLL_L=Lambda(a0:L,a1:L,a2:L)=>{ t3:L=DirectMethodHandle.internalMemberName(a0:L); t4:L=MethodHandle.linkToStatic(a1:L,a2:L,t3:L);t4:L} & DMH.MN=java.lang.StringConcatHelper.simpleConcat(Object,Object)String/invokeStatic } ] linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object,Object,Object)Object/invokeStatic + MethodHandle(String,String)String HelloWorld linkCallSite StrConcat.main(StrConcat.java:6) java.lang.invoke.StringConcatFactory.makeConcatWithConstants(Lookup,String,MethodType,String,Object[])CallSite/invokeStatic makeConcatWithConstants(String)String/BSA1=World linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_LL linkCallSite target => (String)String : invoke000_LL_L=Lambda(a0:L/SpeciesData[LL => BoundMethodHandle$Species_LL],a1:L)=>{ t2:L=BoundMethodHandle$Species_LL.argL1(a0:L); t3:L=BoundMethodHandle$Species_LL.argL0(a0:L); t4:L=MethodHandle.invokeBasic(t3:L,a1:L,t2:L);t4:L} & BMH=[ 0: MethodHandle = {(Object,Object)String : DMH.invokeStatic000_LLL_L=Lambda(a0:L,a1:L,a2:L)=>{ t3:L=DirectMethodHandle.internalMemberName(a0:L); t4:L=MethodHandle.linkToStatic(a1:L,a2:L,t3:L);t4:L} & DMH.MN=java.lang.StringConcatHelper.simpleConcat(Object,Object)String/invokeStatic } 1: ( World ) ] linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object,Object)Object/invokeStatic + MethodHandle(String)String HelloWorld linkCallSite StrConcat.main(StrConcat.java:7) java.lang.invoke.StringConcatFactory.makeConcatWithConstants(Lookup,String,MethodType,String,Object[])CallSite/invokeStatic makeConcatWithConstants(String,int)String/BSA1= linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_LLLLL linkCallSite target => (String,int)String : invoke014_LLI_L=Lambda(a0:L/SpeciesData[LLLLL => BoundMethodHandle$Species_LLLLL],a1:L,a2:I)=>{ t3:L=BoundMethodHandle$Species_LLLLL.argL4(a0:L); t4:L=MethodHandle.invokeBasic(t3:L,a1:L); t5:L=BoundMethodHandle$Species_LLLLL.argL3(a0:L); t6:J=MethodHandle.invokeBasic(t5:L,t4:L,a2:I); t7:L=BoundMethodHandle$Species_LLLLL.argL2(a0:L); t8:L=MethodHandle.invokeBasic(t7:L,t6:J); t9:L=BoundMethodHandle$Species_LLLLL.argL1(a0:L); t10:J=MethodHandle.invokeBasic(t9:L,t6:J,t8:L,t4:L,a2:I); t11:L=BoundMethodHandle$Species_LLLLL.argL0(a0:L); t12:L=MethodHandle.invokeBasic(t11:L,t8:L,t10:J);t12:L} & BMH=[ 0: MethodHandle = {(byte[],long)String : DMH.invokeStatic001_LLJ_L=Lambda(a0:L,a1:L,a2:J)=>{ t3:L=DirectMethodHandle.internalMemberName(a0:L); t4:L=MethodHandle.linkToStatic(a1:L,a2:J,t3:L);t4:L} & DMH.MN=java.lang.StringConcatHelper.newString(byte[],long)String/invokeStatic } 1: MethodHandle = {(long,byte[],String,int)long : invoke007_LJLLI_J=Lambda(a0:L/SpeciesData[LL => BoundMethodHandle$Species_LL],a1:J,a2:L,a3:L,a4:I)=>{ t5:L=BoundMethodHandle$Species_LL.argL1(a0:L); t6:J=MethodHandle.invokeBasic(t5:L,a1:J,a2:L,a4:I); t7:L=BoundMethodHandle$Species_LL.argL0(a0:L); t8:J=MethodHandle.invokeBasic(t7:L,t6:J,a2:L,a3:L);t8:J} & BMH=[ 0: MethodHandle = {(long,byte[],String)long : invoke004_LJLL_J=Lambda(a0:L/SpeciesData[LL => BoundMethodHandle$Species_LL],a1:J,a2:L,a3:L)=>{ t4:L=BoundMethodHandle$Species_LL.argL1(a0:L); t5:L=BoundMethodHandle$Species_LL.argL0(a0:L); t6:J=MethodHandle.invokeBasic(t5:L,a1:J,a2:L,a3:L,t4:L);t6:J} & BMH=[ 0: MethodHandle = {(long,byte[],String,String)long : DMH.invokeStatic002_LJLLL_J=Lambda(a0:L,a1:J,a2:L,a3:L,a4:L)=>{ t5:L=DirectMethodHandle.internalMemberName(a0:L); t6:J=MethodHandle.linkToStatic(a1:J,a2:L,a3:L,a4:L,t5:L);t6:J} & DMH.MN=java.lang.StringConcatHelper.prepend(long,byte[],String,String)long/invokeStatic } 1: ( null ) ] } 1: MethodHandle = {(long,byte[],int)long : invoke006_LJLI_J=Lambda(a0:L/SpeciesData[LL => BoundMethodHandle$Species_LL],a1:J,a2:L,a3:I)=>{ t4:L=BoundMethodHandle$Species_LL.argL1(a0:L); t5:L=BoundMethodHandle$Species_LL.argL0(a0:L); t6:J=MethodHandle.invokeBasic(t5:L,a1:J,a2:L,a3:I,t4:L);t6:J} & BMH=[ 0: MethodHandle = {(long,byte[],int,String)long : DMH.invokeStatic003_LJLIL_J=Lambda(a0:L,a1:J,a2:L,a3:I,a4:L)=>{ t5:L=DirectMethodHandle.internalMemberName(a0:L); t6:J=MethodHandle.linkToStatic(a1:J,a2:L,a3:I,a4:L,t5:L);t6:J} & DMH.MN=java.lang.StringConcatHelper.prepend(long,byte[],int,String)long/invokeStatic } 1: ( null ) ] } ] } 2: MethodHandle = {(long)byte[] : DMH.invokeStatic004_LJ_L=Lambda(a0:L,a1:J)=>{ t2:L=DirectMethodHandle.internalMemberName(a0:L); t3:L=MethodHandle.linkToStatic(a1:J,t2:L);t3:L} & DMH.MN=java.lang.StringConcatHelper.newArray(long)byte[]/invokeStatic } 3: MethodHandle = {(String,int)long : invoke012_LLI_J=Lambda(a0:L/SpeciesData[LLJ => BoundMethodHandle$Species_LLJ],a1:L,a2:I)=>{ t3:J=BoundMethodHandle$Species_LLJ.argJ2(a0:L); t4:L=BoundMethodHandle$Species_LLJ.argL1(a0:L); t5:J=MethodHandle.invokeBasic(t4:L,t3:J,a2:I); t6:L=BoundMethodHandle$Species_LLJ.argL0(a0:L); t7:J=MethodHandle.invokeBasic(t6:L,t5:J,a1:L);t7:J} & BMH=[ 0: MethodHandle = {(long,String)long : DMH.invokeStatic005_LJL_J=Lambda(a0:L,a1:J,a2:L)=>{ t3:L=DirectMethodHandle.internalMemberName(a0:L); t4:J=MethodHandle.linkToStatic(a1:J,a2:L,t3:L);t4:J} & DMH.MN=java.lang.StringConcatHelper.mix(long,String)long/invokeStatic } 1: MethodHandle = {(long,int)long : BMH.reinvoke001_LJI_J=Lambda(a0:L/SpeciesData[L => Species_L],a1:J,a2:I)=>{ t3:L=Species_L.argL0(a0:L); t4:J=MethodHandle.invokeBasic(t3:L,a1:J,a2:I);t4:J} & BMH=[ 0: MethodHandle = {(long,int)long : DMH.invokeStatic006_LJI_J=Lambda(a0:L,a1:J,a2:I)=>{ t3:L=DirectMethodHandle.internalMemberName(a0:L); t4:J=MethodHandle.linkToStatic(a1:J,a2:I,t3:L);t4:J} & DMH.MN=java.lang.StringConcatHelper.mix(long,int)long/invokeStatic } ] } 2: ( 0 ) ] } 4: MethodHandle = {(Object)String : DMH.invokeStatic007_LL_L=Lambda(a0:L,a1:L)=>{ t2:L=DirectMethodHandle.internalMemberName(a0:L); t3:L=MethodHandle.linkToStatic(a1:L,t2:L);t3:L} & DMH.MN=java.lang.StringConcatHelper.stringOf(Object)String/invokeStatic } ] linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object,int,Object)Object/invokeStatic + MethodHandle(String,int)String Hello0