假设我正在JVM 7之上实现一种动态类型化的语言,该语言支持invokedynamic
指令在运行时链接方法。
动态类型的语言具有add
函数,该函数可通过将整数相加来处理整数,并通过将其串联来处理字符串。现在假设add
是由一种通用的列表处理方法调用的,该方法仅在编译时知道(它在编译时)保存了对象(整数或字符串或两者)。
在将方法编译为JVM字节码时,invokedynamic
如何为我提供帮助,因为它必须分派给两个不同的内部函数,即添加整数的实际函数和连接字符串的实际函数?
最佳答案
简而言之,invokedynamic
使您可以调用具有给定签名的方法,而无需知道该方法所属的类。如果add()
方法仅将Object
(或其他常见的基本类型)作为参数,则可以在许多其他不相关的类中使用add(Object)
方法,并且invokedynamic
将能够调用它们。只要目标对象具有该方法,它将被调用。