写点什么

OpenJDK 更新了 InvokeDynamic

  • 2011-01-12
  • 本文字数:1001 字

    阅读完需:约 3 分钟

就在圣诞节之前,OpenJDK 构建开始包含更新版本的 JSR 292 API 了,虽然尚非最终版,但却是一个好的迹象,向我们展现了 JSR 的形成过程。有些人可能还不太熟悉 JSR 292,它添加了全新的字节码指令:invokedynamic,可以在缺少静态类型信息的情况下执行方法调用,InfoQ 对此曾做过报道

John Rose 的博客对主要的变化进行了总结,如下所示:

  1. CallSite 类变成抽象的了,分解为 3 个子类:MutableCallSite、ConstantCallSite 及 VolatileCallSite。
  2. java.dyn.Linkage 不建议使用,将会在最终的公开草案中被移除。
  3. 移除了 java.dyn.JavaMethodHandle 类。Rose 的博客上写到“使用 Lookup.findVirtual (cached in a private static final) 与 MethodHandle.bindTo 可以将任意对象转换为方法句柄。可以使用 MethodHandles.asInstance 将方法句柄转换为任意的 SAM 接口”。

某些 API 仍旧是临时性的,未来可能会发生变化,这包括 MethodHandles.AsInstanceObject 接口,它为应用提供了一种机制,可以使其在方法句柄与 SAM 对象间重复转换,整个过程不会有创建未绑定的委托链的风险。此外,目前有些 JVM 选项需要手工开启才能与 JSR 292 搭配使用(XX:+UnlockExperimentalVMOptions、-XX:+EnableInvokeDynamic 及 -XX:+EnableMethodHandles),在不远的将来这些选项将会默认开启。

令人失望的是 JDK 7 没有在 Java 语言中包含对 invokedynamic 指令的支持,它可能会在 JDK 8 的 Project Lambda 中重新引入(实现 Java lambda 的实际计划是使用 JSR 292 中所引入的几个特性,包括 Method Handles 与动态调用)。但同时,Rose 将几个小的类文件转换器放在了一起(叫做“ indify ”),可用于生成 invokedynamic 指令,还可以为 MethodHandle 和 MethodType 常量生成“ldc”指令。Rémi Forax 也认识到了这个问题,于是开发了一个名为 DynamicIndy 的类。如 Forax 所述,这个类使用 Java 字节码操作库 ASM 4.0(尚未发布)来生成能够调用 invokedynamic 的静态方法。接下来,该静态方法会被转换为可由 Java 调用的 MethodHandle。

虽然 JSR 292 主要关注于动态语言的需求,但很显然,Java 本身已经成为该 API 的候选用户了。从这个角度来看,人们建议修改 java.dyn 这个包名。Brian Goetz 和 Mark Reinhold 提议将其修改为 java.lang.mh(mh 代表 MethodHandle),同时还欢迎其他的建议,这些建议可以先放到 Rémi Forax 的博客上。

查看英文原文: InvokeDynamic Updates in OpenJDK

2011-01-12 23:401895
用户头像

发布了 88 篇内容, 共 268.3 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

模块三作业 - 消息队列系统架构设计文档

青鸟飞鱼

架构实战营

第 0 期架构训练营模块 3 作业

架构实战营

架构实训营 作业三——消息队列架构设计文档

开拓纪

第三章作业 #架构实战营

读写锁

wzh

Java 并发编程 并发 JUC

一文看懂 Go 的数据类型

Rayjun

Go 语言

架构训练营——模块2作业

圆心角

模块3 学习总结

TH

架构实战营

Spark中将DAG划分为Stage核心算法

五分钟学大数据

spark 5月日更

优秀程序员都在注意的十个点

好好学习,天天向上

Java 设计模式 代码 技巧

【LeetCode】制作 m 束花所需的最少天数Java题解

Albert

算法 LeetCode 5月日更

第三课作业

杰语

GoF23 中的对象行为模式草图!

鲁米

消息队列架构设计

俞嘉彬

架构实战营

HBase与Hadoop的关系

大数据技术指南

HBase 5月日更

Go 杂谈——interface与nil的细节让我出了线上BUG

HZFEStudio

Go 语言

通过 Netty、ZooKeeper 手撸一个 RPC 服务!

Yano

Java 微服务 Netty RPC

ARTS - week 8 补打卡

steve_lee

消息队列详细设计架构文档

Hesher

架构 MQ Architecture 消息队列 架构实战营

架构实战营 模块三:学习总结

👈

架构实战营

模块3作业 3

wade

#架构实战营

借鉴AQS的CHL思路解决消息多线程消费顺序ACK问题

Coder的技术之路

AQS 多线程 高并发 架构设计 消息队列

Java Stream 源码分析

Yano

Java stream

模块3作业 消息队列架构设计文档

TH

架构实战营

用组合式创新模型做产品建模

石云升

组合式创新 5月日更 产品建模

【架构实战营】第3模块作业

swordman

架构实战营

FFmpeg音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

liuzhen007

音视频 5月日更

9个国外最佳免费编程学习一站式网站,谁用谁知道!

北游学Java

Java c++ php JavaScript

消息队列构架设计文档

Chris Cheng

Semaphore

wzh

Java 并发 java工具类

架构实战营-模块3-作业

笑春风

架构实战营模块三作业

冷大大

作业 架构实战营 模块三

OpenJDK更新了InvokeDynamic_Java_Charles Humble_InfoQ精选文章