假设我在JVM 7上实现动态类型语言,它支持 invokedynamic 指令以在运行时链接方法 .
invokedynamic
动态类型语言有一个函数 add ,它通过连接它们来处理整数,并通过连接它们来处理字符串 . 现在假设 add 由一个通用列表处理方法调用,该方法只知道(在编译时)它保存对象,整数或字符串或两者 .
add
在将方法编译为JVM字节码时, invokedynamic 如何帮助我,因为它必须调度到两个不同的内部函数,即添加整数的实际函数和连接字符串的实际函数?
简而言之, invokedynamic 允许您在不知道方法所属的类的情况下调用具有给定签名的方法 . 如果你的 add() 方法只是将 Object (或其他常见的基类型)作为参数,那么你可以在许多其他不相关的类中使用 add(Object) 方法,并且 invokedynamic 将能够调用它们 . 只要目标对象具有该方法,就会调用它 .
add()
Object
add(Object)
您还可以查看以下相关文章:
Dynamic Language Support on the Java Virtual Machine
Dynamically Typed Languages and the invokedynamic Instruction
在我的研究期间,我还找到了以下链接,我想分享:
JSR 292 Cookbook
它是一个源代码集合,展示了如何使用JSR 292来实现您可以在动态语言运行时中找到的常用模式 . (从页面复制说明 . )
3 回答
简而言之,
invokedynamic
允许您在不知道方法所属的类的情况下调用具有给定签名的方法 . 如果你的add()
方法只是将Object
(或其他常见的基类型)作为参数,那么你可以在许多其他不相关的类中使用add(Object)
方法,并且invokedynamic
将能够调用它们 . 只要目标对象具有该方法,就会调用它 .您还可以查看以下相关文章:
Dynamic Language Support on the Java Virtual Machine
Dynamically Typed Languages and the invokedynamic Instruction
在我的研究期间,我还找到了以下链接,我想分享:
JSR 292 Cookbook
它是一个源代码集合,展示了如何使用JSR 292来实现您可以在动态语言运行时中找到的常用模式 . (从页面复制说明 . )