lambda实现原理

个人博文地址:http://www.waltersun.cn/documents/java/java-lambdaprinciple.html

  • Lambda表达式声明的地方会生成一个invokedynamic指令,同时编译器生成一个对应的引导方法(Bootstrap Method)。

  • 第一次执行invokedynamic指令时,会调用对应的引导方法(Bootstrap Method),该引导方法会调用LambdaMetafactory.metafactory方法动态生成内部类。

  • 引导方法会返回一个动态调用CallSite对象,这个CallSite会最终调用实现了Runnable接口的内部类。❏ Lambda表达式中的内容会被编译成静态方法,前面动态生成的内部类会直接调用该静态方法。

  • 真正执行lambda调用的还是用invokeinterface指令。

为什么Java 8的Lambda表达式要基于invokedynamic指令来实现呢?Oracle的开发者专门写了一篇文章介绍了Java 8Lambda设计时的考虑以及实现方法。文中提到Lambda表达式可以通过内部类、method handle、dynamic proxies等方式实现,但是这些方法各有优劣。实现Lambda表达式需要达成两个目标,为未来的优化提供最大的灵活性,且能保持类文件字节码格式的稳定。使用invokedynamic可以很好地兼顾这两个目标。invokedynamic与之前四个invoke指令最大的不同就在于它把方法分派的逻辑从虚拟机层面下放到程序语言。

Lambda表达式采用的方式并不是在编译期间生成匿名内部类,而是提供一个稳定的字节码二进制表示规范,对用户而言看到的只有invokedynamic这样一个非常简单的指令。用invokedynamic来实现把方法翻译的逻辑隐藏在JDK的实现中,后续想替换实现方式非常简单,只用修改LambdaMetafactory.metafactory里面的逻辑就可以了。这种方法把Lambda翻译的策略由编译期间推迟到运行时,未来的JDK会怎样实现Lambda表达式可能还会有变化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Walter Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值