写点什么

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

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

关注

评论

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

不会有人还不知道全文检索工具Lucene怎么用吧?文字长文教程

给你买橘子

Java 搜索引擎 lucene 程序员 开发工具

【计算机网络】网络层——路由器与路由选择协议

烫烫烫个喵啊

计算机网络 网络层

云原生实践系列:概述

孤岛旭日

Serverless 微服务 Service Mesh 服务架构

iOS - CollectionViewCell对应不同flow layout的实例

teoking

ios

玛雅密码社区不忘初心 共筑未来通证新经济

Geek_116789

谈谈对分布式事务的一点理解和解决方案

Throwable

分布式 分布式事务 架构设计

list vs tupple

Leetao

Python 数据结构 Python基础知识

ARST Week7

时之虫

ARTS 打卡计划

基础篇:Object对象

csc

Java Java 25 周年

架构师训练营第六周总结

陈靓-哲露

数据分析之AB testing实战(附Python代码)

JackTian

Python 编程 程序员 数据分析 AB testing实战

“新基建”来了!云南三年投资3776亿!

CECBC

架构师训练营第六周作业

烟雨濛濛

11个提高产品经理工作效率的必备工具,果断收藏

马踏飞机747

大数据 设计 产品经理

SpringBoot 入门:02 - 实现 MVC

封不羁

Java spring springboot

大话设计模式 | 4. 装饰模式

Puran

C# 设计模式

架构师训练营第六周作业

Melo

并行流ParallelStream中隐藏的陷阱

Throwable

Java

SpringBoot2.x入门:应用打包与启动

Throwable

springboot

修炼我们的智慧之眼

J.Smile

认知提升

如何搭建Hive 环境

Rayjun

大数据 hive

DolphinScheduler-1.3.0-dev功能体验

Eights

大数据 hadoop

北京区块链规划重点发展海淀朝阳通州等区,加大对代币监管力度

CECBC

北京行动计划 四个高地 需求导向 为政务服务

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

newbe36524

Docker .net core netcore ASP.NET Core

3W字干货深入分析基于Micrometer和Prometheus实现度量和监控的方案

Throwable

Java 监控 Grafana Prometheus springboot

看动画学算法之:排序-冒泡排序

程序那些事

算法 动画 排序算法 轻松学

计算机的时钟(一):NTP协议

ElvinYang

基础篇:JAVA基本类型

csc

Java Java 25 周年

架构师训练营第六周总结

烟雨濛濛

Vagrant 快速入门

FeiLong

vagrant

百万级别数据Excel导出优化

Throwable

架构设计 springboot

OpenJDK更新了InvokeDynamic_Java_Charles Humble_InfoQ精选文章