【问题标题】:How can polymorphism be achieved with JDK7's invokedynamicJDK7的invokedynamic如何实现多态性
【发布时间】:2011-10-18 15:27:56
【问题描述】:

假设我在 JVM 7 上实现了一种动态类型语言,它支持 invokedynamic 指令在运行时链接方法。

动态类型语言有一个函数add,它通过添加整数来处理整数,并通过连接它们来处理字符串。现在假设add 是由一个通用列表处理方法调用的,该方法只知道(在编译时)它持有对象,整数或字符串或两者兼有。

invokedynamic 在将方法编译为 JVM 字节码时如何帮助我,因为它必须分派到两个不同的内部函数,即添加整数的实际函数和连接字符串的实际函数?

【问题讨论】:

    标签: java dynamic polymorphism java-7


    【解决方案1】:

    简而言之,invokedynamic 允许您调用具有给定签名的方法,而无需知道该方法所属的类。如果您的add() 方法只接受Object(或其他常见的基本类型)作为参数,那么您可以在许多其他不相关的类中拥有add(Object) 方法,并且invokedynamic 将能够调用它们。只要目标对象有方法,就会被调用。

    【讨论】:

    • 我想我明白你在说什么。这意味着我的动态调用站点将必须返回一个通用方法句柄,该句柄查找正确的加法器(取决于参数的类型)并调用它,不是吗?
    • 如果这就是你想走的路,我想那是对的。如果您给invokedynamic 一个对象和一个方法签名,它将调用该对象上的方法。如果您想自己进行一些搜索以确定invokedynamic 之前的适当签名,您当然可以这样做。
    【解决方案2】:
    【解决方案3】:

    在我的研究过程中,我还发现了以下链接,我想分享一下:

    JSR 292 Cookbook

    它是一个源代码集合,展示了如何使用 JSR 292 来实现您可以在动态语言运行时中找到的常用模式。 (从他们的页面复制的描述。)

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多