当前位置: 首页 > 后端技术 > Java

Lambda表达式

时间:2023-04-01 16:37:14 Java

JDK使用invokedynamic和VMAnonymousClass在Java语言层面实现Lambda表达式。invokedynamic:invokedynamic是Java7为了在JVM上运行动态语言而引入的一种新的虚拟机指令。它可以在运行时动态解析出调用点限定符所引用的方法,然后执行该方法,invokedynamic指令调度逻辑由用户设置的bootstrap方法决定。VMAnonymousClass:可以看作是一种模板机制。当程序动态生成很多结构相同而只有少数常量不同的类时,可以先创建一个包含常量占位符的模板类,然后使用Unsafe.defineAnonymousClass方法定义特定类时填充模板的占位符生成具体的匿名类。生成的匿名类没有显式挂在任何ClassLoader下。只要该类不存在实例对象,也没有强引用引用该类的Class对象,该类就会被GC回收。因此,与Java语言层面的匿名内部类相比,VMAnonymousClass不需要通过ClassClassLoader加载,更容易回收。在Lambda表达式的实现中,调用点是通过invokedynamic指令调用bootstrap方法产生的。在这个过程中,通过ASM动态生成字节码,然后通过Unsafe的defineAnonymousClass方法定义实现相应功能接口的匿名类,然后实例化这个匿名类并返回与功能方法的方法句柄关联的调用点在这个匿名类中;那么就可以通过这个调用点来实现调用相应Lambda表达式的定义逻辑的功能。//https://blog.csdn.net/jiangyu...//https://blog.csdn.net/qq_3796...lambda表达式与普通匿名内部类的实现方式不同。第二个编译阶段只是增加了一个lambda方法,通过invokedynamic指令指定了在第二个编译(运行)过程中需要执行的额外操作。第二次编译通过工厂java/lang/invoke/LambdaMetafactory。生成类的方法(作为参数传入的方法是第一次编译时生成的lambda方法。)这个操作最终会生成一个实现了lambda表达式的内部类(VMAnonymousClass)。