写点什么

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:401900
用户头像

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

关注

评论

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

SimpleDateFormat类的安全问题,这6个方案总有一个适合你

华为云开发者联盟

Java 高并发 线程池 线程安全 SimpleDateFormat类

持续进击,STI上演极致通缩模型

西柚子

ETL批量作业调度TASKCTL桌面应用端安装步骤

敏捷调度TASKCTL

kettle 批量任务 ETL 自动化运维 调度任务

图数据库|基于 Nebula Graph 的 Betweenness Centrality 算法

NebulaGraph

数据库 算法 图数据库

什么是低代码开发?

源字节1号

软件开发 低代码开发

直播技术干货分享:千万级直播系统后端架构设计的方方面面

JackJiang

直播技术 即时通讯IM 音视频技术

王世杰:读博被美国拒签之后

OneFlow

人工智能 深度学习 计算机视觉 深度学习框架 oneflow

【直播预告】凡泰讲堂第一期:洞见云原生,Kubernetes技术详解与实践

FinClip

Kubernetes

了解云桌面,看这一篇文章就够了!

天翼云开发者社区

java培训和自学哪个适合你,自学需要什么条件

@零度

JAVA开发 自学java

要想推荐系统做的好,图技术少不了

华为云开发者联盟

推荐系统 图分析 图技术 单部图 异构图

阿拉德之怒手游超详细图文架设教程

echeverra

游戏开发

云端守望者(下):十八般武艺

天翼云开发者社区

云计算 云存储

架构实战营总结

刘洋

#架构实战营 「架构实战营」

正则表达式提取 git 提交记录中的新增代码行

OpenHacker

JavaScript 正则表达式

Tapdata 与阿里云 PolarDB 开源数据库社区联合共建开放数据技术生态

tapdata

数据库

从Python到C++调用过程分析|OneFlow学习笔记

OneFlow

Python 人工智能 机器学习 深度学习框架 oneflow

为什么说Aquqnee有望成为GameFi板块天花板

西柚子

云端守望者(上):十二道难关

天翼云开发者社区

云主机 云安全

为什么说Aquqnee有望成为GameFi板块天花板

小哈区块

TiDB 在连锁快餐企业丨海量交易与实时分析的应用探索

PingCAP

英特尔中国研究院“双轮驱动,融合创新”,解锁智能发展新机遇

科技新消息

走进英特尔中国研究院,探索科技创新无穷奥秘

科技新消息

企业为什么要实施知识管理?

小炮

知识管理 企业知识管理 企业知识管理工具

Groovy踩坑记之方法调用八层认识

FunTester

天翼云CDN+云主机护航,全天候支撑云上战“疫”

天翼云开发者社区

上海理工大学:巧用数字技术打响智慧抗疫信息战

华为云开发者联盟

低代码 welink 防疫 AppCube 核酸检测

Telnet是什么意思?与SSH有啥区别?

行云管家

运维 SSH IT运维

linux运维是做什么工作的?有哪些岗位?

行云管家

运维 网络运维 IT运维

开源之夏 2022 与您相约!

RadonDB

数据库 开源 开源之夏

Go Runtime 设计:计算资源调度

张旭海

Go runtime goroutine scheduler

OpenJDK更新了InvokeDynamic_Java_Charles Humble_InfoQ精选文章