如何使用invokedynamic执行多态的方法?

时间:2013-11-26 05:11:35

标签: java invokedynamic

在Java的动态语言中,所有变量都声明为java.lang.Object,我需要调用Java内置类。例如,java.math.BigDecimal构造函数可以接受数字,字符串等。

a = 10  // a is `java.lang.Object`
create java.math.BigDecimal(a)  // should call constructor that accept number
a = '1.234'  // a is `java.lang.Object`
create java.math.BigDecimal(a)  // should call constructor that accept String

我可以使用java.lang.invoke生成适当的MethodHandle吗? MethodHandle应该接受java.lang.Object作为其参数,但是在调用时,它应该调用正确的构造函数。

2 个答案:

答案 0 :(得分:1)

您可以使用java反射,例如使用ConstructorUtils.invokeConstructor(...)

答案 1 :(得分:0)

您正在寻找创建内联缓存。最初,你的bootstrap方法将返回绑定到方法句柄的调用站点,该方法句柄检查其参数类型,在BigInteger上找到正确的构造函数(或任何类型 - 将此类型作为静态参数传递给bootstrap方法),并重新链接调用站点首先检查此类型并调用正确的构造函数,或者再次查找构造函数。因此,如果该调用站点仅传递字符串,则只执行一次构造函数的反射搜索,而进一步调用只是一种类型检查并直接调用构造函数。 (这与JVM内联虚拟方法调用的方式非常相似。)

我不太了解invokedynamic以便为您提供示例代码,但我可以指向JSR 252 Cookbook做类似的事情,其中​​记录了talk from the JVM Language Summit 2011和{{ 3}}