关于java:Lambda表达式

8次阅读

共计 953 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0