0

在所有变量都声明为的 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我可以用来生成合适的MethodHandleMethodHandle应该接受一个作为它的java.lang.Object参数,但是当被调用时,它应该调用正确的构造函数。

4

2 回答 2

1

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

于 2013-11-26T05:16:00.307 回答
0

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

我不太了解invokedynamic,无法为您提供示例代码,但我可以为您指出做类似事情的JSR 252 Cookbook ,在JVM Language Summit 2011 的演讲随附的幻灯片中记录了这一点。

于 2014-06-29T17:30:38.667 回答