JDK应用invokedynamic及VM Anonymous Class联合来实现Java语言层面上的Lambda表达式。

invokedynamic: invokedynamic是Java 7为了实现在JVM上运行动静语言而引入的一条新的虚拟机指令,它能够实现在运行期动静解析出调用点限定符所援用的办法,而后再执行该办法,invokedynamic指令的分派逻辑是由用户设定的疏导办法决定。VM Anonymous Class:能够看做是一种模板机制,针对于程序动静生成很多构造雷同、仅若干常量不同的类时,能够先创立蕴含常量占位符的模板类,而后通过Unsafe.defineAnonymousClass办法定义具体类时填充模板的占位符生成具体的匿名类。生成的匿名类不显式挂在任何ClassLoader上面,只有当该类没有存在的实例对象、且没有强援用来援用该类的Class对象时,该类就会被GC回收。故而VM Anonymous Class相比于Java语言层面的匿名外部类无需通过ClassClassLoader进行类加载且更易回收。

在Lambda表达式实现中,通过invokedynamic指令调用疏导办法生成调用点,在此过程中,会通过ASM动静生成字节码,而后利用Unsafe的defineAnonymousClass办法定义实现相应的函数式接口的匿名类,而后再实例化此匿名类,并返回与此匿名类中函数式办法的办法句柄关联的调用点;而后能够通过此调用点实现调用相应Lambda表达式定义逻辑的性能。

// https://blog.csdn.net/jiangyu...
// https://blog.csdn.net/qq_3796...

lambda表达式与一般的匿名外部类的实现形式不一样,

在第一次编译阶段只是多增了一个lambda办法,并通过invoke dynamic 指令指明了在第二次编译(运行)的时候须要执行的额定操作第二次编译时通过java/lang/invoke/LambdaMetafactory.metafactory 这个工厂办法来生成一个class(其中参数传入的办法就是第一次编译时生成的lambda办法。)

这个操作最终还是会生成一个实现lambda表达式的外部类(VM Anonymous Class)。