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)。